Фон
Я пытаюсь проверить тип некоторого кода (модуль 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. Причина, по которой я решил использовать свои собственные решения вместо получения других решений, заключается в том, что у меня есть модный режим проверки, где он не печатает все пакеты (и, надеюсь, в какой-то момент также общий размер загрузки и установки).