【问题标题】:How can an assignment statement "x = y := f(x)" be done when using assignment expressions in Python?在 Python 中使用赋值表达式时如何完成赋值语句“x = y := f(x)”?
【发布时间】:2018-07-05 07:41:03
【问题描述】:

我读到in Twitter

#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 -- Assignment Expressions 将其描述为存在于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 版本是一个问题。

【问题讨论】:

  • 这是in the PEP
  • @user2357112 是的,谢谢,这是我从那里得到的。这就是为什么我问怎么做

标签: python pep python-3.8 python-assignment-expression


【解决方案1】:

作为 PEP 中的explicitly stated

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

y0 = y1 := f(x)  # INVALID

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

还有later

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

...

# INVALID
x = y := 0

# Valid alternative
x = (y := 0)

【讨论】:

    猜你喜欢
    • 2012-04-01
    • 2019-01-01
    • 1970-01-01
    • 2021-11-23
    • 2014-03-01
    • 2022-12-12
    • 2015-07-15
    • 2018-03-04
    • 1970-01-01
    相关资源
    最近更新 更多