首页 > 解决方案 > 缺少“输入导入列表”-脚本中的错误,但函数中没有

问题描述

我最近很惊讶地看到我们的一些代码在“列表”上有一个 linter 警告,相当于:

class MyClass:
    def method(self):
        myVar: List[str] = []

短绒警告是因为from typing import List导入中缺少此文件。因此,PyCharm 将此标记为 linter 错误。当然代码不正确。令人惊讶的是这段代码可以运行,并且已经正常运行了几个月!

深入研究,我发现这是:

class MyClass:
    def method(self):
        myVar: List[str] = []

m = MyClass()
m.method()

还有这个:

def method(self):
    l: List[str] = []

method(None)

运行正常,但是这个:

l: List[str] = []

引发预期错误!

Traceback (most recent call last):
  File ".../scratches/scratch_3.py", line 5, in <module>
    l: List[str] = []
NameError: name 'List' is not defined

那么......什么给了?

(版本:我在跑步

Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

但是该代码适用于 WINDOWS 和 LINUX (UBUNTU) 构建的几个不同版本的 PYTHON。
)

标签: pythonlistimporttyping

解决方案


如PEP 526中所述,Python 以不同方式处理全局和局部变量的注释。模块级和类级变量的注释被评估,但局部变量的注释不被评估。

这是有道理的,因为可以通过__annotations__字典访问模块和类级别的注释,因此它必须评估注释并记录它。另一方面,不能以编程方式访问局部变量注释,因此评估它们没有意义。


推荐阅读