我在推特上读到:
#Python 新闻:Guido 接受了 PEP 572。Python 现在有赋值表达式。
if (match := (pattern.search) pattern.search(data)) is not None: print((match.group) mo.group(1)) filtered_data = [y for x in data if (y := f(x)) is not None]
(更正第二行代码中的矿井)
如前所述,PEP 572 -- 赋值表达式描述了这存在于Python 3.8中:
这是一个提议,用于创建一种使用符号为表达式中的变量赋值的方法
NAME := expr
。
我已经浏览了描述和示例,我发现这是一种避免重复调用或分配的便捷方法,所以不要:
match1 = pattern1.match(data)
match2 = pattern2.match(data)
if match1:
return match1.group(1)
elif match2:
return match2.group(2)
或更高效:
match1 = pattern1.match(data)
if match1:
return match1.group(1)
else:
match2 = pattern2.match(data)
if match2:
return match2.group(2)
现在可以说:
if match1 := pattern1.match(data):
return match1.group(1)
elif match2 := pattern2.match(data):
return match2.group(2)
同样,现在可以说:
if any(len(longline := line) >= 100 for line in lines):
print("Extremely long line:", longline)
但是,我不明白 PEP 中给出的这个例子是如何无效的:
y0 = y1 := f(x) # INVALID
说得对y0 = (y1 := f(x))
吗?怎么可能使用?
对于那些想知道它在哪里可用的人的脚注:我已经安装了Python 3.7,但它在那里不起作用,因为 PEP 当前显示为“状态:草稿”。但是,PEP 谈到了概念证明/参考实现(https://github.com/Rosuav/cpython/tree/assignment-expressions),所以使用包含它的 Python 3.8 alpha 0 版本是一个问题。