python - 缺少“输入导入列表”-脚本中的错误,但函数中没有
问题描述
我最近很惊讶地看到我们的一些代码在“列表”上有一个 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。
)
解决方案
如PEP 526中所述,Python 以不同方式处理全局和局部变量的注释。模块级和类级变量的注释被评估,但局部变量的注释不被评估。
这是有道理的,因为可以通过__annotations__
字典访问模块和类级别的注释,因此它必须评估注释并记录它。另一方面,不能以编程方式访问局部变量注释,因此评估它们没有意义。
推荐阅读
- php - .min.css 和 .min.js 文件的 Nginx 问题
- gmail - Dsync 中的 rfc822 花括号 / gmail
- php - 如何通过 brew 在 macOS 上安装和使用 PHP
- html - 删除按钮以从数组中删除 html 列表项和项
- ruby-on-rails - Ruby on Rails 中的验证测试总是错误的
- r - 为 R 中的不同参数值绘制多个图
- r - 在 R 中使用 SparklyR 更改嵌套列名称
- excel - 如何显示最早时间
- javascript - 从边缘移除堆叠的线条
- google-app-engine - 多页 URL 后备 (index.html & subpage.html)