在查找包源代码(漏勺)中的某些答案时,我偶然发现了一个我无法理解的字符串。我的 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 - 可读性因速记而受到损害。
答案 0 :(得分:15)
如果keyname的计算结果为False,则and
语句将立即返回false,而不是评估第二部分。否则,它将评估第二部分(而不是在这种情况下返回值很重要)。所以它基本上等同于:
if keyname:
keyparts.append(keyname)
我不确定它是非常pythonic,因为我刚建议的版本看起来更具可读性(至少对我个人而言)。
答案 1 :(得分:3)
and
和or
是short-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)