【问题标题】:Understanding the reason for the new python := operator了解新 python := 运算符的原因
【发布时间】:2019-09-20 13:59:17
【问题描述】:

这是一个元编程问题:我想了解为什么 python 开发人员引入了另一个带有新 := 的运算符。我知道它是干什么用的。但是,我想知道为什么开发人员选择一个新符号而不是重新使用例如as 运算符。

即为什么认为写作更可取

while (command := input("> ")) != "quit":
    print("You entered:", command)

而不是

while input("> ") as command != "quit":
    print("You entered:", command)

【问题讨论】:

  • as 是一个已经是语言一部分的关键字,例如import itertools as itwith open(file) as f:
  • 正是我的观点。它已经有两种用途,例如from。为什么不添加第三个?
  • 我认为解析新符号比重载as 运算符更容易(可能是模棱两可?)。也使用户更容易区分用途而不是在许多不同情况下使用一个符号/运算符
  • @Chris_Rands 谢谢,这基本上回答了它。我在阅读 PEP 时一定跳过了这一点。

标签: python python-3.x language-design python-3.8 python-assignment-expression


【解决方案1】:

PEP 572回答了这个问题

替代拼写

与当前的语义大致相同 提案,但拼写不同。

EXPR as NAME:

stuff = [[f(x) as y, x/y] for x in range(5)]

由于EXPR as NAME 已经在importexceptwith 中具有意义 语句(具有不同的语义),这会产生不必要的 混淆或需要特殊情况(例如,禁止在 这些语句的标题)。

(注意with EXPR as VAR 并不是简单地赋值EXPRVAR——它调用EXPR.__enter__()并将其结果分配给 VAR.)

更喜欢 := 而不是这种拼写的其他原因包括:

if f(x) as y 中,分配目标不会跳到你身上——它 只是读起来像if f x blah blah,在视觉上与if f(x) and y太相似了。

在所有其他允许使用as 子句的情况下,即使是读者 具有中介技能的人会导致预期该条款(但是 可选)由开始该行的关键字和语法关系 该关键字与as 子句非常接近:

import foo as bar

except Exc as var

with ctxmgr() as var

相反,赋值表达式不属于ifwhile 这开始了,我们故意允许分配 其他上下文中的表达式也是如此。

之间的平行节奏

NAME = EXPR

if NAME := EXPR

加强视觉识别 赋值表达式。

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2016-03-13
    相关资源
    最近更新 更多