python-3.x 为什么允许使用`banddef`作为变量的类型提示?

k3fezbri  于 8个月前  发布在  Python
关注(0)|答案(1)|浏览(89)

Python grammar有这样的规则:

assignment:
    | NAME ':' expression ['=' annotated_rhs ] 
    # other options for rule omitted

expression规则允许lambda定义(lambdef)。
这意味着这个python语法是有效的:

q: lambda p: p * 4 = 1

是否有一个允许lambda的用例,或者这只是一个有点松散的语法的怪癖?类似地,这允许条件类型a: int if b > 3 else str = quux,这似乎更合理一些,但仍然出乎意料。

v09wglhw

v09wglhw1#

这在PEP-0526(变量注解的注解)中有规定。Python不关心注解,只要**“它计算而不引发”**。类型检查器的职责是将其标记为无效注解。
引用PEP:

注解的其他用途

而Python具有此PEP不会反对:
alice: 'well done' = 'A+'
bob: 'what a shame' = 'F-'
由于它不会关心“* it evaluates without raising*"之外的类型注解,因此遇到它的类型检查器将标记它,除非使用#type: ignore@no_type_check禁用。
然而,由于Python不会关心“类型”是什么,如果上面的代码片段是在全局级别或类中,__annotations__将包含{'alice': 'well done', 'bob': 'what a shame'}
这些存储的注解可以用于其他目的,但是对于这个PEP,我们明确推荐类型提示作为注解的首选用途。
例如,使用mypy运行代码段将产生以下错误:

file.py:1: error: Invalid type comment or annotation  [valid-type]

相关问题