在Python3.6中考虑以下情况:
basepackage
|---__init__.py
|---package
|---__init__.py
|---subpackage
|---__init__.py
|---module.py
重要细节:内部basepackage.package.__init__.py
有:
from basepackage.package.subpackage.module import AClass as AliasedClass
现在,让我们在basepackage.package.subpackage.module.py
中使用:
import basepackage.package.subpackage.module as aliased_module
[1]
结果是:
AttributeError: module 'basepackage' has no attribute 'package'
堆栈跟踪列出了以下罪魁祸首语句(按以下顺序):
from basepackage.package.subpackage.module import AClass as AliasedClass
import basepackage.package.subpackage.module as aliased_module
但是如果你不想用[1]
来代替:
from basepackage.package.subpackage import module as aliased_module
[2]
然后一切正常。你知道吗
为什么[1]
与[2]
有如此大的不同,以至于前者会导致错误,而后者不会?你知道吗
要使第一个选项(
import basepackage.package.subpackage.module as aliased_module
)起作用,必须满足以下条件:basepackage/__init__.py
必须包含类似于from . import package
的行(名称package
必须在此basepackage/__init__.py
文件中定义)basepackage/package/__init__.py
必须包含类似于from . import subpackage
的行basepackage/package/subpackage/__init__.py
必须包含类似于from . import module
的行注意:
__init__.py
文件中的import语句也可以是绝对路径,而不是相对路径。你知道吗对于第二个选项(
from basepackage.package.subpackage import module as aliased_module
),如果每个级别都有空的__init__.py
文件,只要这些__init__.py
文件存在就足够了。你知道吗相关问题 更多 >
编程相关推荐