Как пишется импорт пакетов / модулей Python для этой ситуации?

1

У меня есть эти файлы 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

Как мне это сделать?

Теги:
python-packaging

1 ответ

0
Лучший ответ

Добавьте файлы __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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню