Как разрешить относительный круговой импорт в Python3.5 +, используемый только для проверок типов классов данных? - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть структура файла следующим образом:

├── test_package
│   ├── __init__.py
│   └── models
│       ├── __init__.py
│       ├── a.py
│       └── b.py

И следующее содержимое файла:

# a.py
from .b import B
from dataclasses import dataclass

@dataclass
class A:
    b: B

# b.py
from .a import A
from dataclasses import dataclass

@dataclass
class B:
    a: A

При попытке импортировать пакет a я получаю следующую ошибку.

: import test_package.models.a                                                                 
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-e8165f4eb507> in <module>
----> 1 import test_package.models.a

/.../test_package/models/a.py in <module>
----> 1 from .b import B
      2 from dataclasses import dataclass
      3 
      4 @dataclass
      5 class A:

/.../test_package/models/b.py in <module>
----> 1 from .a import A
      2 from dataclasses import dataclass
      3 
      4 @dataclass
      5 class B:

ImportError: cannot import name 'A' from 'test_package.models.a'

Согласно журналу изменений Python3.5 , «Круговой импорт, связанный с относительным импортом, теперь поддерживается. (Предоставлено Бреттом Кэнноном и Антуаном Питроу в bpo-17636.)заставить этот относительный круговой импорт работать?

Обратите внимание, что мне нужно только выполнить этот импорт для проверки типов.

Редактировать:

В ответ на @ juanpa.arrivillaga вкомментарии, вот пример той же ошибки, происходящей с Python 2.7. Кажется, что исходные файлы находятся и выполняются, если я что-то не так понимаю.

$ cat a.py
from b import b_func

def a_func():
    return "Hi"

$ cat b.py
from a import b_func

def b_func():
    return "Hi"

>>> import a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "a.py", line 1, in <module>
    from b import b_func
  File "b.py", line 1, in <module>
    from a import b_func
ImportError: cannot import name b_func
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...