PEP 526 中的 Linting 变量注释拼写错误
Linting variable annotation typo from PEP 526
我不得不调试生产中的一个问题,归结为以下行为。
我应该输入的内容:
>>> import pandas as pd
>>> from io import StringIO
>>> a: pd.DataFrame = pd.read_csv(StringIO('a,b,c\n1,2,3'))
>>> isinstance(a, pd.DataFrame)
True
我实际输入的内容:
>>> a = pd.DataFrame = pd.read_csv(StringIO('a,b,c\n1,2,3'))
>>> isinstance(a, pd.DataFrame)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a type or tuple of types
这很难追踪,因为 isinstance()
检查是在输入错误几个月后添加的。原始代码之所以有效,是因为 pd.DataFrame
未在范围内的其他任何地方使用。
有什么办法可以捕捉到这个令人讨厌的错字吗? mypy
没有发现问题。
编辑:原始问题使用 list
而不是 pd.DataFrame
,但正如一些用户指出的那样,这两个 flake8 plugin and pylint W0622 都可以检测到重新定义的内置函数。
TL;DR
pip install pandas-stubs
mypy 应该开始失败:
error: Cannot assign to a type
长答案
你假设 mypy 应该阻止它是正确的。但问题是 pandas 项目还没有包含类型信息。到目前为止(2021 年 3 月)pandas 团队有自己的存根项目正在进行中,请参阅 https://pypi.org/project/pandas-stubs/。
我不得不调试生产中的一个问题,归结为以下行为。
我应该输入的内容:
>>> import pandas as pd
>>> from io import StringIO
>>> a: pd.DataFrame = pd.read_csv(StringIO('a,b,c\n1,2,3'))
>>> isinstance(a, pd.DataFrame)
True
我实际输入的内容:
>>> a = pd.DataFrame = pd.read_csv(StringIO('a,b,c\n1,2,3'))
>>> isinstance(a, pd.DataFrame)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a type or tuple of types
这很难追踪,因为 isinstance()
检查是在输入错误几个月后添加的。原始代码之所以有效,是因为 pd.DataFrame
未在范围内的其他任何地方使用。
有什么办法可以捕捉到这个令人讨厌的错字吗? mypy
没有发现问题。
编辑:原始问题使用 list
而不是 pd.DataFrame
,但正如一些用户指出的那样,这两个 flake8 plugin and pylint W0622 都可以检测到重新定义的内置函数。
TL;DR
pip install pandas-stubs
mypy 应该开始失败:
error: Cannot assign to a type
长答案
你假设 mypy 应该阻止它是正确的。但问题是 pandas 项目还没有包含类型信息。到目前为止(2021 年 3 月)pandas 团队有自己的存根项目正在进行中,请参阅 https://pypi.org/project/pandas-stubs/。