这种奇怪的结肠行为是做什么的?[重复]
- 2025-02-20 09:22:00
- admin 原创
- 49
问题描述:
我正在使用 Python 3.6.1,遇到了一些非常奇怪的事情。我有一个简单的字典赋值错误,花了我很长时间才找到。
context = {}
context["a"]: 2
print(context)
输出
{}
代码在context["a"]: 2
做什么?在我看来,它应该引发 ,但实际上没有SyntaxError
。起初我以为它正在创建一个切片。但是,输入repr(context["a"]: 2)
会引发SyntaxError
。我还在context["a"]: 2
控制台中输入了 ,控制台没有打印任何内容。我以为它可能返回了None
,但我不太确定。
我也认为它可以是一行 if 语句,但这也不应该是正确的语法。
此外,context["a"]
还应提出KeyError
。
我很困惑。发生了什么事?
解决方案 1:
您不小心写了一个语法正确的变量注释。该功能是在 Python 3.6 中引入的(请参阅PEP 526)。
尽管变量注释被解析为带注释的赋值的一部分,但赋值语句是可选的:
annotated_assignment_stmt ::= augtarget ":" expression ["=" expression]
因此,在context["a"]: 2
context["a"]
是注释目标2
是注释本身context["a"]
未初始化
PEP 指出“注释的目标可以是任何有效的单个赋值目标,至少在语法上是这样(由类型检查器决定如何处理它)”,这意味着键不需要存在即可进行注释(因此没有KeyError
)。以下是原始 PEP 中的一个例子:
d = {}
d['a']: int = 0 # Annotates d['a'] with int.
d['b']: int # Annotates d['b'] with int.
通常,注释表达式应该求值为 Python 类型——毕竟注释的主要用途是类型提示,但这不是强制的。注释可以是任何有效的Python 表达式,无论结果的类型或值如何。
如你所见,此时类型提示非常宽松且很少有用,除非你有一个静态类型检查器(例如mypy )。
解决方案 2:
注释自动存储在__annotations__
字典中。对于x: y
. , y
必须是一个有效表达式,即y
,或 右侧的任何内容都:
必须求值。另一方面x
, 必须至少能够成为键,因此可哈希化。
此外,LHS 不能是集合,因为集合是不可哈希的,>>> {2}: 8
SyntaxError: illegal target for annotation
也不是列表:>>> [2]: 8
[2]: 8 SyntaxError: only single target (not list) can be annotated
也不是元组:
>>> (2,3): 8
(2,3): 8 SyntaxError: only single target (not tuple) can be annotated