Страницы

Поиск по вопросам

вторник, 27 ноября 2018 г.

Опциональная типизация в python: проблемы с импортами

Пишу на python 3.5, пробую пользовать типизацию, но столкнулся с проблемой циклического импортирования - стало сложно разбивать программу на модули.
Одна из проблем отношение одни_к_одному:
# модуль 1 from mod1 import B
class A: def __init__(self): self.__B = B(self)
# модуль 2 from mod2 import A
class B: def __init__(self, arg: A): self.__a = arg
Ну и так далее. Проблема серьёзно нарастает с увеличением количества модулей.
Хочу узнать это я к задаче подхожу неверно, или есть решение проблемы?
ПС: я в том смысле, что возбуждается исключение ImportError, и я не могу от него избавиться.


Ответ

PEP 484 -- Type Hints рекомендует использовать import module вместо from module import Type и задавать типы в виде строк, чтобы уменьшить последствия от круговой зависимости, вызванной использованием type hints:
# mod1.py import mod2
class B: def __init__(self, arg: 'mod2.A') -> None: self.__a = arg

# mod2.py import mod1
class A: def __init__(self): self.__b = mod1.B(self)
В качестве альтернативы, если классы настолько тесно связаны, можно их в один модуль поместить или выполнить другой подходящий случаю refactoring (возможно более общий тип, определённый, к примеру, в mod2.types, следует использовать в B). See Type hinting would generate a lot of import statements (possibly leading to circular imports). Use strings instead of imported names?

Комментариев нет:

Отправить комментарий