3

我在推特上读到:

#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 版本是一个问题。

4

1 回答 1

5

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

赋值语句右侧的顶层禁止使用无括号的赋值表达式;例如,以下是不允许的:

y0 = y1 := f(x)  # INVALID

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

后来

从上面的“例外情况”部分中可以看出,它绝不允许与=. 如果需要不同的分组,则应使用括号。

...

# INVALID
x = y := 0

# Valid alternative
x = (y := 0)
于 2018-07-05T07:47:33.050 回答