【问题标题】:Linting variable annotation typo from PEP 526来自 PEP 526 的 Linting 变量注释错字
【发布时间】:2021-03-25 10:52:25
【问题描述】:

我只需要在生产中调试一个归结为以下行为的问题。

我应该输入的内容:

>>> 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 pluginpylint W0622 都可以检测重新定义的内置函数。

【问题讨论】:

标签: python lint mypy pep


【解决方案1】:

TL;DR

pip install pandas-stubs

mypy 应该开始失败:

error: Cannot assign to a type

长答案

您认为 mypy 应该阻止这个是正确的。但问题是 pandas 项目还没有包含类型信息。到现在(2021 年 3 月),pandas 团队有自己的存根项目正在进行中,请参阅https://pypi.org/project/pandas-stubs/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-19
    • 2016-10-26
    • 2015-07-06
    • 2023-03-31
    • 2016-02-25
    • 2014-06-24
    • 1970-01-01
    相关资源
    最近更新 更多