Подсказки типов и предотвращение рекурсии импорта между модулями PythonPython

Программы на Python
Anonymous
Подсказки типов и предотвращение рекурсии импорта между модулями Python

Сообщение Anonymous »

У меня есть два модуля с классами, и я хочу иметь доступные функции для преобразования между их формами. Вот более простой «односторонний» пример, где A может быть передан конструктору B или метод A.to_B может использоваться для выполнения той же конструкции из экземпляра А. В более сложных примерах ни один из классов не будет использоваться в конструкторе, но оба будут иметь методы to_B и to_A соответственно. В любом случае обоим модулям нужны ссылки друг на друга и подсказки по вводу.
Я пытаюсь понять, как использовать аннотации, особенно модуль ввода, чтобы были не циклический импорт, но я также могу четко документировать пользователей пакетов и набирать подсказки (особенно для ipython). Я чувствую, что близок к этому, но не могу точно определить лучшие практики, поэтому подумал, что лучше попросить о помощи.

Код: Выделить всё

class A:
#...

def to_B(self) -> B:
#...
return B(self)

if __name__ == "__main__":
a = A()
b = a.to_B()
print(b.a())

Код: Выделить всё

from a import A
class B:
def __init__(self, a: A) -> None:
self._a = a # Store reference
# Use properties of `a` as a spec for generating B attributes
# ...
return

def a(self) -> A:
return self._a

if __name__ == "__main__":
a = A()
b = B(a)
print(b.a())
В приведенном выше коде вызов B в A.to_B и выдает NameError, как для обратного вызова, так и для обратного вызова как аннотация. Поэтому вместо этого я могу использовать встроенный импорт и изменить возвращаемую ссылку (т. е. прямую ссылку, как указано в PEP563) для to_B(self), которая компилируется и запускается без проблем. Изменения в a.py следующие:

Код: Выделить всё

from typing import TYPE_CHECKING
if TYPE_CHECKING:
from b import B

#...
class A:
# ...
def to_B(self) -> "B":
from b import B
# ...
return B(self)
Должен ли я в качестве альтернативы выполнять условный импорт, проверяя locals() внутри to_B во время выполнения, а не всегда импортировать B внутри to_B ? Я чувствую, что нарушаю золотые правила Python, импортируя из заголовка файлов .py, ха-ха.
Это лучший способ обеспечить ввод подсказок между связанными модулями , а также предотвращает рекурсию импорта модулей?

Подробнее здесь: https://stackoverflow.com/questions/787 ... on-modules

Вернуться в «Python»