У меня есть модуль с именем Module.py с функцией функция, которая возвращает тип с очень длинным именем,
Код: Выделить всё
Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_againЧтобы сделать код более читабельным, я определил псевдоним типа T в соответствующем файле-заглушке mod.pyi .Вот упрощенная версия моего кода mod.pyi:
Код: Выделить всё
T = Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again
def function()->T: pass
class Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again: pass
Код: Выделить всё
import module
foo:module.T = module.function()
Что я пробовал
Поиск в Google
Я искал в Google «псевдоним типа mypy, используемый только в файле-заглушке» но не смог найти решение, которое предотвращает mypy от распознавания псевдонима типа в других модулях. Я ожидал, что определение T только в файле-заглушке ограничит его область действия, но похоже, что mypy способен найти псевдоним типа даже в других модулях.
исправление кода< /h5>
Я попробовал несколько подходов, в том числе:
[*]Переименование псевдонима типа: I изменил T на _T, чтобы снизить вероятность его обнаружения другими модулями, но это не решило проблему.
[*]Использование if TYPE_CHECKING: Я попробовал условно определить псевдоним типа внутри if TYPE_CHECKING , но это также не помешало использованию псевдонима типа в других модулях.
[*]Ограничение экспорта: я добавил __all__ = [" функция", «Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again»] в файл Module.pyi, чтобы явно контролировать, какие имена экспортируются, но псевдоним типа T все еще был доступен.
Вот измененный код модуля.pyi:
Код: Выделить всё
from typing import TYPE_CHECKING
if TYPE_CHECKING:
_T = Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again
def function()->_T: pass
class Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again: pass
__all__ = ["function", "Type_whose_name_is_so_long_that_we_do_not_want_to_call_it_over_and_over_again"]
Код: Выделить всё
import module
foo:module._T = module.function() # Still works
Подробнее здесь: https://stackoverflow.com/questions/793 ... her-module
Мобильная версия