Mypy + flake8: есть ли способ отменить предупреждение `F821 undefined name` - PullRequest
0 голосов
/ 04 декабря 2018

В следующем коде flake8 произнесите F821 undefined name 'B'.Но для mypy подсказка типа для f необходима.Как игнорировать такие предупреждения с помощью flake8?

def f(b: B) -> None:
    pass


class B():
    pass

Этот пример можно решить тривиально: изменить порядок объявлений.Но иногда я не могу изменить заказы в реальных случаях.Такие вводящие в заблуждение предупреждения являются для меня шумными.

Мой env: Python 3.6 + flake8 3.6.0 + mypy 0.641 + flake8-mypy 17.8.0

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Это не вводящее в заблуждение предупреждение, и не следует игнорировать , выполнение вашего кода в настоящий момент приведет к сбою:

$ python3.8 t.py
Traceback (most recent call last):
  File "t.py", line 1, in <module>
    def f(b: B) -> None:
NameError: name 'B' is not defined

У вас есть два варианта, чтобы исправить это, одинэто явно использовать предварительное объявление (заключая имя в кавычки):

def f(b: 'B') -> None:
    pass


class B():
    pass

время выполнения:

$ python3.8 t.py
$ flake8 t.py

Или использовать from __future__ import annotations (новое в python3.7):

from __future__ import annotations


def f(b: B) -> None:
    pass


class B():
    pass

ПРИМЕЧАНИЕ : я использую flake8 3.7.x, который также улучшил обработку форвардных аннотаций и комментариев типа

0 голосов
/ 04 декабря 2018

Вы можете использовать # noqa:, чтобы отключить некоторые ошибки.Пример:

test.py

def f(b: B) -> None:  # noqa: F821
    pass


class B():
    pass

bash

$ flake8 test.py
(return no error)

См. Также: http://flake8.pycqa.org/en/3.1.1/user/ignoring-errors.html#in-line-ignoring-errors

...