繁体   English   中英

如果/ else替换,如何不在列表选择中评估两个函数?

[英]How to don't evaluate both functions in list choice if/else alternative?

我遇到的情况是:

  1. 在评估之前,函数内容是以字符串形式动态创建的,
  2. 我不想使用if test: dosomething else: dosomethingElse来组成内容,因为用户可以更改部分字符串内容,我不希望他们必须在conditionnal语句中管理数学表达式之间的空格。

所以,我使用以下列表提示: [dosomethingElse, dosomething][ test ] dosomethingElse,dosomething [dosomethingElse, dosomething][ test ] ,( [dosomethingElse, dosomething][ test ]真/假答案给我dosomething / dosomethingElse)。

该解决方案正常工作,但dosomething和dosomethingElse 在测试检查之前进行了评估 ,我只想评估一个。 (我处于严格的时间限制状态)。

有没有办法在一行中只评估一个函数?

这里,代码的主要步骤。 这里列出了“依赖关系”,但它们在原始程序中得到很好的管理。

  1. 创建独特的fun_id

     def gen_id(): s = 10000 while s: yield s s += 1 fun_ticket = gen_id() 
  2. 有趣的描述(名称,参数,表达式,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()) 
  3. 准备要评估的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"]) 
  4. 结果: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结果,只评估dosomethingdosomethingelse一个。 引用文档:

表达式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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM