mypy: disallow_any_unimported не работает должным образом - PullRequest
0 голосов
/ 09 апреля 2020

Я добавляю аннотации типов в существующий проект в python 3.7. В проекте используется sqlalchemy, но я не использую их заглушки, поскольку они неполные. Тем не менее, я хотел бы аннотировать атрибуты в моих классах ORM, и я бы хотел, чтобы mypy принудительно применял аннотации ко всем этим.

Вот минимальный пример, иллюстрирующий то, что я имею в виду:

test .py:

from sqlalchemy import Column, Integer
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import as_declarative

@as_declarative
class Base:
    pass

class Foo(Base):
    __tablename__ = 'foo'

    oid = Column(Integer, primary_key=True)

mypy.ini:

[mypy]

[mypy-sqlalchemy.*]
ignore_missing_imports = True

[mypy-test]
disallow_any_unimported = True

При этом я ожидал, что mypy будет жаловаться на отсутствующий тип атрибута oid, который затем можно будет исправить с помощью oid: int = Column(...). Но я не получаю никаких ошибок вообще.

1 Ответ

0 голосов
/ 14 апреля 2020

Хорошо, похоже, я неправильно понял цель disallow_any_unimported. Этот флаг, по-видимому, в основном покрывает случаи, когда неизвестный тип импортируется и используется в аннотации:

from untyped import Foo

# ...
x: Foo = bar

В моем случае oid это вывод , чтобы быть Any, поскольку mypy не знает, что Column() возвращает .

Так что, похоже, мне нужно использовать флаг disallow_any_expr, который запрещает использование Any внутри любого выражения.

edit : disallow_any_expr имеет побочный эффект, также запрещающий использование Integer в моем исходном примере (и, возможно, других вещах). Несмотря на то, что в документах говорится, что Any все еще разрешено в вызовах функций, которые, как я ожидал, распространяются на конструкторы. Так что этот флаг не является ответом на мою проблему. Однако я не мог найти что-то более мелкозернистое.

...