我正在使用Python3.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
我很困惑。发生了什么事
您意外地编写了语法正确的变量注释。这个特性是在Python3.6中引入的(参见PEP 526)
尽管变量注释是作为annotated assignment的一部分进行分析的,但赋值语句是可选的:
因此,在
context["a"]: 2
context["a"]
是注释目标2
是注释本身context["a"]
未初始化PEP声明,“注释的目标可以是任何有效的单一赋值目标,至少在语法上是如此(由类型检查器决定如何处理)”,这意味着注释不需要存在键(因此不存在^{)。以下是原始政治公众人物的一个例子:
通常,注释表达式应计算为Python类型 毕竟注释的主要用途是类型暗示,但它不是强制的。注释可以是任何有效的Python表达式,而不管结果的类型或值如何
正如您所看到的,此时类型提示非常随意,很少有用,除非您有一个静态类型检查器,如mypy
注释自动存储在
__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
相关问题 更多 >
编程相关推荐