Mypy не может найти функцию класса, когда класс определен в другом файле - PullRequest
0 голосов
/ 11 июля 2019

Фон

Я пытаюсь проверить тип некоторого кода (модуль ANSIBLE). Проблема в том, что я импортирую этот класс AnsibleModule. Класс является одноэлементным, и почти каждой функции он нужен, поэтому я сделал его глобальным В верхней части моего кода у меня есть

module: Optional[AnsibleModule] = None

Практически первая строка main тогда устанавливает module равным тому, что должно быть (примерно module = AnsibleModule(...), но почти 20 строк и не имеет значения).


Задача

Я получаю сообщения об ошибках типа error: Item "None" of "Optional[AnsibleModule]" has no attribute "run_command" каждый раз, когда вызываю функцию, имеющуюся в AnsibleModule. Все это исчезнет, ​​если я избавлюсь от необязательного и просто получу module: AnsibleModule (заменен единственной ошибкой, которую я не могу присвоить None для AnsibleModule


Минимальный пример

Затем я разработал минимальный рабочий пример поведения

# me_mod.py

from typing import Optional

class Thing:
    def me_func(self, stuff: str) -> None:
        print(stuff)

meThing: Thing
meThing.me_func("words")

meThing2: Optional[Thing] = None
meThing2 = meThing
meThing2.me_func("more words")

# other_mod.py

from typing import Optional
from me_mod import Thing

meThing: Optional[Thing] = None
meThing = Thing
meThing.me_func("better words")

когда я запускаю mypy на other_mod.py, я получаю

other_mod.py:5: error: Incompatible types in assignment (expression has type "Type[Thing]", variable has type "Optional[Thing]")
other_mod.py:6: error: Item "None" of "Optional[Thing]" has no attribute "me_func"

И когда я запускаю mypy на me_mod.py, все хорошо.

Так что происходит и как мне это исправить?


Дальнейший фон

Я делаю ANSI-модуль для установки, удаления и обновления материалов из AUR. Причина, по которой я решил использовать свои собственные решения вместо получения других решений, заключается в том, что у меня есть модный режим проверки, где он не печатает все пакеты (и, надеюсь, в какой-то момент также общий размер загрузки и установки).

...