Странное поведение с импортом Python - PullRequest
0 голосов
/ 11 ноября 2009

Итак, я пытаюсь импортировать модуль "foo", который содержит каталоги "bar" и "wiz". «bar» содержит файлы Python a.py, b.py и c.py. «wiz» содержит файлы Python x.py, y.py и z.py.

$ ls foo
__init__.py     bar       wiz
$ ls foo/bar
__init__.py     a.py      b.py      c.py
$ ls foo/wiz
__init__.py     x.py      y.py      z.py

В оболочке python (точнее, в оболочке django manage.py), я набираю следующую строку и вижу следующие результаты:

>>> import foo
>>> dir(foo.bar)
['__builtins__', '__doc__', '__file__', '__name__', '__path__', 'a']
>>> dir(foo.wiz)
['__builtins__', '__doc__', '__file__', '__name__', '__path__', 'x', 'y']
>>> foo.wiz.x
<module 'foo.wiz.x' from '/dir/'>
>>> foo.wiz.z
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'module' object has no attribute 'z'

Почему сюда импортируются только определенные модули? Почему я не могу получить доступ к z или b или c? Я думал, что все будет импортировано и доступно только на основе каталога, в котором они находятся. Кроме того, в случае сбоя импорта происходит сбой в автоматическом режиме.

Кто-нибудь знает, что здесь происходит?

Ответы [ 2 ]

2 голосов
/ 11 ноября 2009

При импорте foo Python просто загружает foo/__init__.py, но не загружает (автоматически) foo.bar или foo.wiz. Следовательно, попытка доступа к ним без явного импорта приведет к увеличению AttributeError.

Если какой-либо модуль импортирует подмодули, такие как foo.bar или foo.bar.a, Python загрузит соответствующие файлы и создаст ссылку на объект module в foo. Поэтому возможно, что некоторые модули доступны без явного импорта.

Если вы хотите, чтобы foo.bar всегда экспортировал свои подмодули a, b и c, вы можете импортировать их из foo/bar/__init__.py. Затем эти модули будут доступны при импорте foo.bar.

1 голос
/ 11 ноября 2009

Вы не импортировали "z" (возможно, x был импортирован в какой-то другой модуль):

Python 2.4.3 (#1, Jan 14 2008, 18:31:21)
[GCC 4.1.2 20070626 (Red Hat 4.1.2-14)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo
>>> foo.wiz
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'module' object has no attribute 'wiz'
>>> from foo import wiz
>>> foo.wiz
<module 'foo.wiz' from 'foo/wiz/__init__.pyc'>
>>> from foo.wiz import x
>>> foo.wiz.x
<module 'foo.wiz.x' from 'foo/wiz/x.pyc'>
>>> foo.wiz.z
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'module' object has no attribute 'z'
>>> import foo.wiz.z
>>> foo.wiz.z
<module 'foo.wiz.z' from 'foo/wiz/z.py'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...