Как мне разрешить этот циклический импорт?Python

Программы на Python
Ответить
Anonymous
 Как мне разрешить этот циклический импорт?

Сообщение Anonymous »

При реализации виртуальной файловой системы я столкнулся с проблемой циклического импорта.
common.py:

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

from typing import TYPE_CHECKING

if TYPE_CHECKING:
from .directory import Directory
from .archive import Archive

class VFile:
def __init__(self, data: bytes, parent: Directory | Archive ...):
...
archive.py:

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

from .util import guess_type

class Archive(VFile):
def _read(self):
for m in metadata:
data = ...
FileType = guess_type(data)
self.files.append(FileType(data, self))
...
directory.py:

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

from .util import guess_type

class Directory(VFile):
def _parse_btree(self):
FileType = guess_type(data)
self.files.append(FileType(data, self))
...
util.py:

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

from .common import VFile
from .archive import Archive
from .directory import Directory

def guess_type(data: bytes) -> type[VFile]:
if is_archive(data):
return Archive
if is_dir(data):
return Directory
...
return VFile

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

TYPE_CHECKING
решает часть проблемы, но я не могу решить остальную, не объединив все файлы в один. Как мне это реорганизовать?
Циркуляр с подсказками здесь не уместен. Настоящий циркуляр — это Archive, вызывающий догадку_type(), которая ссылается на Archive и Directory, также вызывающую догадку_type(), которая ссылается на Directory.

Подробнее здесь: https://stackoverflow.com/questions/798 ... lar-import
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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