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/