У меня есть эти файлы Python
project/packages/foo/job.py
project/packages/foo/models.py
project/packages/foo/stuff/Thing.py
models.py содержит class Thing
и Thing.py содержит функции, связанные с Thing
job.py пытается это сделать:
from . import models
from . import stuff
def job ():
x = models.Thing (123)
stuff.Thing.related_function (x)
Это дает ошибку:
AttributeError: модуль 'foo.stuff' не имеет атрибута 'Thing'
Я пробовал варианты импорта, но не могу заставить его работать. Я хочу, чтобы не принести Thing
в пространстве имен, но всегда должны относиться к нему как models.Thing
или stuff.Thing
Как мне это сделать?
Добавьте файлы __init__
:
project/packages/foo/__init__.py
project/packages/foo/job.py
project/packages/foo/models.py
project/packages/foo/stuff/__init__.py
project/packages/foo/stuff/Thing.py
В пакете stuff
инициализируйте подмодуль, добавив эту строку:
# in project/packages/foo/stuff/__init__.py file
from foo.stuff import Thing
Другой __init__.py
может быть пустым.
Теперь в вашем job.py
коде models.Thing
атрибут должен решить (это класс) и stuff.Thing
атрибут должен решить (это подмодуль).
Примечание. Это не хорошее соглашение об именах, чтобы иметь имя модуля, соответствующее классу, в рамках одного и того же проекта, что излишне запутывает. Я рекомендую переименовать субмодуль Thing
для "функций, связанных с Thing
", к чему-то другому, может быть, thing_helpers
.