在 Python 中使用赋值表达式时,如何"x = y := f(x)"完成赋值语句?



我在推特上读到:

#Python 新闻:圭多接受了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 版本是一个问题。

正如PEP中明确指出的那样,

不允许在赋值语句右侧的顶层使用不带括号的赋值表达式;例如,不允许使用以下内容:

y0 = y1 := f(x)  # INVALID

同样,包含此规则是为了避免两种视觉上相似的方式来表达同一件事。

后来,

如上文"例外情况"一节所述,绝不允许与=处于同一级别。如果需要不同的分组,则应使用括号。

# INVALID
x = y := 0
# Valid alternative
x = (y := 0)

相关内容

  • 没有找到相关文章

最新更新