Python больше проблем с импортом модулей - PullRequest
1 голос
/ 18 февраля 2010

Я задал похожий вопрос вчера, но с тех пор приобрел действительно странную проблему.С этой структурой каталогов:

app/
    models/
        __init__.py
        user.py
        other.py
    pages/
        __init__.py
        pages.py

Файл models / __ init__.py имеет следующую строку:

__all__ = ['user', 'other']

, а страницы / __ init__.py имеют

__all__ = ['pages']

В pages.py, чтобы использовать любой из классов в user.py или other.py, я должен иметь

from models import *
import models

вверху, а затем я могу объявить класс Userкак это:

my_user = models.user.User()

Если я исключу один из операторов импорта в верхней части, я получу такие ошибки, как

"Class user has no attribute User"

Любая помощь будет принята.Я люблю Python, но мне бы хотелось, чтобы его функции импорта работали больше как PHP.

Ответы [ 3 ]

2 голосов
/ 18 февраля 2010

Есть два варианта, в зависимости от того, где вы хотите быть явным и насколько вы хотите, чтобы он был доступен «по умолчанию» (что также означает принудительный).

В этих файлах __init__ вы можете использовать:

# models/__init__.py shown:
import user, other                 # ambiguous relative import
from . import user, other          # relative import
from app.models import user, other # absolute import

Или, если в противном случае вы просто получили бы import models, используйте:

from models import user, other
# or:
import models.user, models.other

Последняя форма более предпочтительна.

1 голос
/ 18 февраля 2010

Одна вещь, которая может быть очень полезной, когда вы изучаете Python (или отлаживаете), - это запускать в интерактивном режиме и использовать функцию dir(), чтобы увидеть, что там где:

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__']
>>> import models
>>> dir(models)
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> models.user
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'user'
>>> from models import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'models', 'other', 'user']
>>> dir(models)
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__','__path__', 'other', 'user']
>>> user
<module 'models.user' from 'C:\test\models\user.py'>
>>> models.user
<module 'models.user' from 'C:\test\models\user.py'>
>>> user.User
<class 'models.user.User'>

Обновление: исправлен вывод.

0 голосов
/ 18 февраля 2010
import models.user
...