11

在包源代码(具体是漏勺)中寻找一些答案时,我偶然发现了一个我无法理解的字符串。我的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——为了速记,可读性受到损害。

4

3 回答 3

15

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

if keyname: 
    keyparts.append(keyname)

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

于 2012-05-03T23:03:46.773 回答
3

and并且or短路逻辑运算符;这意味着一旦 Python 知道答案必须是什么,它就会停止评估任何剩余的子句。

在您发布的代码段and中,用于保护.extend()and.append()功能 - 例如,作者可能不想发布None到列表中。

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

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

name是一个可能为空的列表——如果它是空的,name[0]将失败并带有一个IndexError,所以我用它来保护它name and——如果name name[0]的,(和if块)不执行并且避免了错误。

这是一个非常Pythonic 的特性。

于 2012-05-04T17:06:37.050 回答
2

由于在python中,语句中的第一个表达式在第二个表达式之前被评估,如果第一个表达式是,and解释器会中断对语句的评估, andFalse

keyname and keyparts.append(keyname)

相当于:

if keyname:
    keyparts.append(keyname)
于 2012-05-03T23:11:15.363 回答