我刚刚开始从事一个项目,其中导入结构是我从未见过的。
这是包装的结构
foo/
__init__.py
bar/
__init__.py
module1.py
module2.py
这是bar/__init__.py
的内容:
from .module1 import *
from .module2 import *
module1.py
仅向module2
导入(为空),但是使用其在项目中的绝对路径:
from foo.bar.module2 import *
从foo
目录内部运行代码时,我可以毫无问题地导入module1
python -c "import foo.bar.module1" # This will raise no error
但是,有人告诉我,从模块中使用import *
是不好的做法(除了使代码难以阅读),所以我决定通过以下方式替换foo/bar/module1.py
中的导入:
import foo.bar.module2 as module2
但是,在尝试执行python命令时,我现在得到了AttributeError
:
python -c "import foo.bar.module1"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Users/loicm/test_structure/foo/bar/__init__.py", line 1, in <module>
from .module1 import *
File "/Users/loicm/test_structure/foo/bar/module1.py", line 1, in <module>
import foo.bar.module2 as mod
AttributeError: module 'foo' has no attribute 'bar'
我很困惑,因为根据我的理解,不同的导入命令将是等效的,因此,如果其中一个引发错误,第二个也将如此
(我知道我可以不导入from ... import *
而不导入*
来使它工作,但是并不能解释为什么不起作用)