Опечатка аннотации переменной Linting из 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 и pylint W0622 могут обнаруживать переопределенные встроенные функции.


person Rafael Barbosa    schedule 25.03.2021    source источник
comment
Плагин Flake8 Builtins: проверьте, используются ли встроенные функции Python в качестве переменных или параметров.   -  person Cristian Ciupitu    schedule 25.03.2021
comment
Отвечает ли это на ваш вопрос? lint для имен переменных, таких как 'len' (встроенные функции/зарезервированные слова и т. д.)   -  person Cristian Ciupitu    schedule 25.03.2021
comment
Отвечает ли это на ваш вопрос? Есть ли способ защитить встроенные модули в python?   -  person Georgy    schedule 25.03.2021
comment
Вы все правы, но ошибка все еще может произойти с типами, отличными от bultin. Я обновил вопрос.   -  person Rafael Barbosa    schedule 25.03.2021


Ответы (1)


TL;DR

pip install pandas-stubs

И mypy должен начать терпеть неудачу с:

error: Cannot assign to a type

Длинный ответ

Вы правы, полагая, что mypy должен был заблокировать это. Но проблема в том, что проект pandas еще не включает информацию о типах. К настоящему времени (март 2021 г.) у команды pandas есть собственный незавершенный проект, см. https://pypi.org/project/pandas-stubs/.

person Cesar Canassa    schedule 25.03.2021