fed*_*qui 4 python pep python-3.8 python-assignment-expression
#Python新闻:Guido接受了PEP572。Python现在具有赋值表达式。
Run Code Online (Sandbox Code Playgroud)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)
Run Code Online (Sandbox Code Playgroud)
或更有效的:
match1 = pattern1.match(data)
if match1:
return match1.group(1)
else:
match2 = pattern2.match(data)
if match2:
return match2.group(2)
Run Code Online (Sandbox Code Playgroud)
现在可以说:
if match1 := pattern1.match(data):
return match1.group(1)
elif match2 := pattern2.match(data):
return match2.group(2)
Run Code Online (Sandbox Code Playgroud)
同样,现在可以说:
if any(len(longline := line) >= 100 for line in lines):
print("Extremely long line:", longline)
Run Code Online (Sandbox Code Playgroud)
但是,我不明白PEP中给出的这个示例如何无效:
Run Code Online (Sandbox Code Playgroud)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版本是一个问题。
正如PEP中明确指出的那样,
未赋括号的赋值表达式在赋值语句右侧的顶层被禁止;例如,以下内容是不允许的:
Run Code Online (Sandbox Code Playgroud)y0 = y1 := f(x) # INVALID同样,包含此规则是为了避免在视觉上用两种相似的方式说同一件事。
而后来,
如上文“例外情况”部分所述,绝对不允许在与相同的级别上使用
=。如果需要不同的分组,则应使用括号。...
Run Code Online (Sandbox Code Playgroud)# INVALID x = y := 0 # Valid alternative x = (y := 0)