我发现在许多不同的项目中,我编写了很多代码,需要评估(中等复杂度,可能需要昂贵的评估)表达式,然后对其进行处理(例如,将其用于字符串格式化),但是仅当表达式为True/non-None时。

例如,在很多地方,我最终都会执行以下操作:

result += '%s '%( <complexExpressionForGettingX> ) if <complexExpressionForGettingX> else ''

...我想这基本上是希望返回表达式的某些函数的更普遍问题的特例,但前提是该表达式为True,即:
f( e() ) if e() else somedefault

但无需重新键入表达式(或重新评估它,以防这是一个代价高昂的函数调用)。

显然,可以通过各种冗长的方式轻松实现所需的逻辑(例如,通过将表达式拆分为多个语句并将该表达式分配给一个临时变量),但这有点麻烦,因为这似乎是一个很普遍的问题,并且由于python非常酷(尤其是对于功能性的东西),我想知道是否存在一种不错的,优雅的,简洁的方法?

我当前的最佳选择是定义一个短期的lambda来处理它(比多个语句更好,但有点难以阅读):
(lambda e: '%s ' % e if e else '')( <complexExpressionForGettingX> )

或编写我自己的效用函数,例如:
def conditional(expr, formatStringIfTrue, default='')

...但是由于我是在许多不同的代码库中执行此操作,因此我宁愿使用内置库函数或某些巧妙的python语法(如果存在)

最佳答案

我绝对喜欢单线。但是有时它们是错误的解决方案。

在专业软件开发中,如果团队规模大于2,则您花在理解别人编写的代码上的时间要多于编写新代码的时间。这里介绍的单行代码绝对是令人困惑的,所以只需做两行(即使您在帖子中提到了多个语句):

X = <complexExpressionForGettingX>
result += '%s '% X  if X else ''

这很清楚,简洁,每个人都立即了解这里发生了什么。

关于python - 在一行中使用两次表达式-作为条件AND进行字符串格式化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14337236/

10-12 18:13
查看更多