[英]Strange behavior with python import
因此,我試圖導入包含目錄“ bar”和“ wiz”的模塊“ foo”。 “ 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 shell中(更准確地說是django manage.py shell),我鍵入以下內容並查看以下結果:
>>> 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? 我認為所有內容都將完全基於包含它們的目錄導入和訪問。 另外,如果導入失敗,則將以靜默方式失敗。
有人知道這是怎么回事嗎?
導入foo
,Python只會加載foo/__init__.py
,而不會(自動)加載foo.bar
或foo.wiz
。 因此,嘗試在不顯式導入它們的情況下訪問它們將引發AttributeError
。
如果某些模塊導入了諸如foo.bar
或foo.bar.a
類的子模塊,Python將加載相應的文件並在foo
創建對該module
對象的引用。 因此,某些模塊可能無需顯式導入即可使用。
如果希望foo.bar
始終導出其子模塊a
, b
和c
,則可以從foo/bar/__init__.py
導入它們。 然后,每當導入foo.bar
時,這些模塊都將可用。
您尚未導入“ 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'>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.