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

fed*_*qui 4 python pep python-3.8 python-assignment-expression

在Twitter上阅读

#Python新闻:Guido接受了PEP572。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]
Run Code Online (Sandbox Code Playgroud)

(在第二行代码中更正我的)

如前所述,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中给出的这个示例如何无效:

y0 = y1 := f(x)  # INVALID
Run Code Online (Sandbox Code Playgroud)

说的正确y0 = (y1 := f(x))吗?如何使用?

那些想知道将在何处可用的人的脚注:我已经安装了Python 3.7,但在那儿不起作用,因为PEP当前显示为“状态:草稿”。但是,PEP讨论了概念证明/参考实现(https://github.com/Rosuav/cpython/tree/assignment-expressions),因此使用包含它的Python 3.8 alpha 0版本是一个问题。

use*_*ica 5

正如PEP中明确指出的那样

未赋括号的赋值表达式在赋值语句右侧的顶层被禁止;例如,以下内容是不允许的:

y0 = y1 := f(x)  # INVALID
Run Code Online (Sandbox Code Playgroud)

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

后来

如上文“例外情况”部分所述,绝对不允许在与相同的级别上使用=。如果需要不同的分组,则应使用括号。

...

# INVALID
x = y := 0

# Valid alternative
x = (y := 0)
Run Code Online (Sandbox Code Playgroud)