在一行中使用一个表达式两次作为条件和字符串格式?

2024-10-04 01:37:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现,在许多不同的项目中,我编写了很多代码,需要计算一个(中等复杂,可能计算成本很高)表达式,然后用它做一些事情(例如,将它用于字符串格式),但前提是表达式为True/non None。在

例如,在很多地方,我都会做如下事情:

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

。。。我想这基本上是一个更普遍的问题的特例,即想要返回表达式的某个函数,但前提是该表达式为真,即:

^{pr2}$

但是不需要重新键入表达式(或者重新计算表达式,以防代价高昂的函数调用)。在

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

我目前最好的选择是定义一个短生命的lambda来处理它(比多个语句好,但是有点难读):

(lambda e: '%s ' % e if e else '')( <complexExpressionForGettingX> )

或者编写自己的实用函数,比如:

def conditional(expr, formatStringIfTrue, default='')

。。。但是,由于我在许多不同的代码库中执行此操作,所以我更愿意使用内置的库函数或一些聪明的python语法(如果存在这样的东西的话)


Tags: 项目方法lambda函数字符串代码if表达式
3条回答

Python没有表达式范围(Is there a Python equivalent of the Haskell 'let'),大概是因为语法的滥用和混乱超过了它的优点。在

如果绝对必须使用表达式范围,则最坏的选择是滥用生成器理解:

result += next('%s '%(e) if e else '' for e in (<complexExpressionForGettingX>,))

我当然喜欢一句话。但有时它们是错误的解决方案。在

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

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

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

可以定义一个条件格式函数一次,然后重复使用:

def cond_format(expr, form, alt):
    if expr:
        return form % expr
    else:
        return alt

用法:

^{pr2}$

相关问题 更多 >