显然(至少对我来说令人惊讶),这是 Python 3.6+ 中完全有效的表达式:
x: 10
这怎么了?我使用模块检查了它ast
并得到以下信息:
[ins] In [1]: ast.parse('x: 10').body
Out[1]: [<_ast.AnnAssign at 0x110ff5be0>]
好的,这是一个带注释的作业。我查阅了语法参考,发现它对应于这条规则:
annassign: ':' test ['=' test]
这对我来说没有多大意义。如果它是一个带注释的赋值,那么为什么表达式的赋值部分是可选的?如果表达式的赋值部分不存在,这可能意味着什么?这真的不奇怪吗?
该annasign
节点仅在一个规则中引用:
expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) |
('=' (yield_expr|testlist_star_expr))*)
在该级别的其他每个可能的投影中,都需要某种赋值表达式(augassign
是一个类似的标记+=
)。那么为什么它是可选的annassign
呢?
我想这似乎是为了成为裸名称表达式的注释版本(即只是x
),但这真的很令人困惑。我对那里的静态类型检查器不太熟悉,但他们可以使用这样的注释吗?
这很可能是故意的,但这似乎是一个错误。这有点问题,因为可以编写语法上有效但完全无意义的代码,如下所示:
a = 1
b = 2
c: 3 # see what I did there? oops!
d = 4
最近,当我将表示形式转换为单独的变量时,我在自己的代码中犯了类似的错误dict
,只有当我的测试管道在 Python 3.5 环境中运行并生成SyntaxError
.
无论如何,我主要只是对意图感到好奇,但也很高兴发现我发现了一个实际的语法错误。