为什么类型提示不能在 for 循环中使用?

Rob*_* Li 3 python python-3.x

在语句中注释目标for无效:

>>> for i: str in test_string:
  File "<stdin>", line 1
    for i: str in test_string:
         ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

我想知道此时拒绝注释的原因。

Mis*_*agi 8

历史上,冒号:在 Python 中具有多种含义。例如,它表示块的开始 ( with a as b:)、切片订阅 ( a[:]) 和字典对 ( {a: b})。

\n

这使得在某些位置引入类型提示变得不可能或至少是不明确的:。具体而言,诸如for或 之类的块标头具有表示标头结束的with冲突含义。虽然可以:定义明确的语法,但这必须根据维护和扩展语法的未来需求进行权衡。到目前为止,这还没有被认为值得。

\n
\n

PEP 526 - 拒绝/推迟的提案

\n

允许在withandfor语句中使用注释:这被拒绝了,因为for它会很难发现实际的可迭代对象,并且with会混淆 CPython 的 LL(1) 解析器。

\n
\n
\n

目前,您可以使用前面的类型提示,或内联类型注释:

\n
a: str\nfor a in my_iterable:\n    ...\n\nfor b in my_iterable:  # type: str\n    ...\n
Run Code Online (Sandbox Code Playgroud)\n
\n

PEP 526 \xe2\x80\x93 不允许注释的地方

\n

仅允许单个赋值目标和单个右侧值。此外,不能注释 for 或 with 语句中使用的变量;它们可以提前注释,类似于元组解包:\n[...]

\n
\n


Juh*_*iya 5

您需要按照https://www.python.org/dev/peps/pep-0526/#where-annotations-aren-t-allowed在循环之前启动它

所以你可以这样做

i : str
for i in test_string: 
    ......
    ......
Run Code Online (Sandbox Code Playgroud)