[英]How to don't evaluate both functions in list choice if/else alternative?
我遇到的情况是:
if test: dosomething else: dosomethingElse
来组成内容,因为用户可以更改部分字符串内容,我不希望他们必须在conditionnal语句中管理数学表达式之间的空格。 所以,我使用以下列表提示: [dosomethingElse, dosomething][ test ]
dosomethingElse,dosomething [dosomethingElse, dosomething][ test ]
,( [dosomethingElse, dosomething][ test ]
真/假答案给我dosomething / dosomethingElse)。
该解决方案正常工作,但dosomething和dosomethingElse 都在测试检查之前进行了评估 ,我只想评估一个。 (我处于严格的时间限制状态)。
有没有办法在一行中只评估一个函数?
这里,代码的主要步骤。 这里列出了“依赖关系”,但它们在原始程序中得到很好的管理。
创建独特的fun_id
def gen_id(): s = 10000 while s: yield s s += 1 fun_ticket = gen_id()
有趣的描述(名称,参数,表达式,id)
from collections import defaultdict d= defaultdict(lambda :defaultdict()) d["dosomething"]["args"] = set(["argA","argB"]) d["dosomething"]["exp"] = "return argA + argB" d["dosomething"]["id"] = "f_%d"%(fun_ticket.next()) d["dosomethingElse"]["args"] = set(["argX","argY","argZ"]) d["dosomethingElse"]["exp"] = "return argX + argY+ argZ" d["dosomethingElse"]["id"] = "f_%d"%(fun_ticket.next()) d["doChoice"]["args"] = set(["argE","argF"]) d["doChoice"]["exp"] = "return [dosomethingElse, dosomething][argE > 0] + argF" d["doChoice"]["id"] = "f_%d"%(fun_ticket.next())
准备要评估的doChoice功能。
dependencies = ('dosomething', 'dosomethingElse', 'doChoice') Allargs = set().union(*[d[x]["args"] for x in dependencies]) funChoice = 'def %s(%s): %s'%(d['doChoice']['id'],",".join(Allargs),d['doChoice']["exp"])
结果:funChoice字符串是:
def f_10002(argX,argY,argZ,argA,argB,argE,argF): return [f_10001(argX,argY,argZ), f_10000(argA,argB)][argE > 0] + argF
这是问题:funChoice评估eval doSomething 和 doSomethingElse。 有没有办法在不使用if else(以及字符串中的空间管理问题)的情况下评估一个?
使用条件表达式 :
dosomething if test else dosomethingelse
根据test
结果,只评估dosomething
和dosomethingelse
一个。 引用文档:
表达式
x if C else y
首先计算条件, C ( 不是x ); 如果C为真,则计算x并返回其值; 否则,评估y并返回其值。
使其适应您的代码:
d["doChoice"]["exp"] = "return (dosomething if argE > 0 else dosomethingElse) + argF"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.