像#var; do_something_with(var)'这样的声明有什么影响?在Python?

时间:2012-05-03 23:00:19

标签: python

在查找包源代码(漏勺)中的某些答案时,我偶然发现了一个我无法理解的字符串。我的 PyCharm 也对它皱眉,'声明似乎没有效果'。

这是代码摘要:

...
for path in e.paths():
    keyparts = []
    msgs = []
    for exc in path:
        exc.msg and msgs.extend(exc.messages()) # <-- what is that?
        keyname = exc._keyname()
        keyname and keyparts.append(keyname) # <-- and that
    errors['.'.join(keyparts)] = '; '.join(interpolate(msgs))
return errors
...

它似乎是非常pythonic,我想掌握它!

UPD。因此,我认为它根本不是pythonic - 可读性因速记而受到损害。

3 个答案:

答案 0 :(得分:15)

如果keyname的计算结果为False,则and语句将立即返回false,而不是评估第二部分。否则,它将评估第二部分(而不是在这种情况下返回值很重要)。所以它基本上等同于:

if keyname: 
    keyparts.append(keyname)

我不确定它是非常pythonic,因为我刚建议的版本看起来更具可读性(至少对我个人而言)。

答案 1 :(得分:3)

andorshort-circuiting个逻辑运算符;这意味着一旦Python知道答案必须是什么,它就会停止评估任何剩余的条款。

在您发布的代码段and用于保护.extend().append()功能 - 可能是作者不想发布,例如None进入名单。

我通常在if语句中使用此功能:

if name and name[0] in ('Mr', 'Mrs', 'Ms'):
    ...

name可能是一个空列表 - 如果它为空,name[0]将失败并显示IndexError,所以我用name and保护它 - 如果{{ 1}} 为空,name(和name[0]块)不执行,并避免错误。

这是非常 Pythonic功能。

答案 2 :(得分:2)

因为在python中,and语句中的第一个表达式在第二个表达式之前被计算,如果第一个表达式为and,则解释器会在评估False语句时停止,

keyname and keyparts.append(keyname)

相当于:

if keyname:
    keyparts.append(keyname)