导入包中的模块在显式导入之前是不可见的
Module within imported package is not visible until explicitly imported
我有一个问题,我在使用各种软件包时遇到过几次。我将包作为一个整体导入并尝试访问一个模块,但它显然不存在。但是,一旦我明确地单独导入它,它就会在我原来导入的命名空间中可用。这里发生了什么事?
示例如下:
import email
print(email.policy)
AttributeError: 'module' object has no attribute 'policy'
from email import policy
print(email.policy)
<module 'email.policy' from 'C:\Anaconda3\lib\email\policy.py'>
来自 my wikipage 我过去曾写过关于此的文章:
导入副作用
导入一个包并不意味着 sub-packages/sub-modules 被导入(尽管有时它看起来像那样!)
考虑以下几点:
$ tree
.
└── pkg
├── __init__.py
├── mod2.py
└── mod.py
1 directory, 3 files
$ tail -n 999 pkg/*
==> pkg/__init__.py <==
==> pkg/mod2.py <==
import pkg.mod
x = 2
==> pkg/mod.py <==
hi = 1
>>> import pkg
# Doesn't work!
>>> pkg.mod
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'mod'
# But if we import some module that has a side-effect of importing that module
>>> import pkg.mod2
# Suddenly it works!
# DON'T EVER DEPEND ON THIS BEHAVIOUR!
>>> pkg.mod
<module 'pkg.mod' from 'pkg/mod.py'>
简而言之,有时导入一个包可能会导入它的子包,但前提是该包的 __init__.py
导入了它。通常,不要依赖此行为并明确导入子包。
我有一个问题,我在使用各种软件包时遇到过几次。我将包作为一个整体导入并尝试访问一个模块,但它显然不存在。但是,一旦我明确地单独导入它,它就会在我原来导入的命名空间中可用。这里发生了什么事?
示例如下:
import email
print(email.policy)
AttributeError: 'module' object has no attribute 'policy'
from email import policy
print(email.policy)
<module 'email.policy' from 'C:\Anaconda3\lib\email\policy.py'>
来自 my wikipage 我过去曾写过关于此的文章:
导入副作用
导入一个包并不意味着 sub-packages/sub-modules 被导入(尽管有时它看起来像那样!)
考虑以下几点:
$ tree
.
└── pkg
├── __init__.py
├── mod2.py
└── mod.py
1 directory, 3 files
$ tail -n 999 pkg/*
==> pkg/__init__.py <==
==> pkg/mod2.py <==
import pkg.mod
x = 2
==> pkg/mod.py <==
hi = 1
>>> import pkg
# Doesn't work!
>>> pkg.mod
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'mod'
# But if we import some module that has a side-effect of importing that module
>>> import pkg.mod2
# Suddenly it works!
# DON'T EVER DEPEND ON THIS BEHAVIOUR!
>>> pkg.mod
<module 'pkg.mod' from 'pkg/mod.py'>
简而言之,有时导入一个包可能会导入它的子包,但前提是该包的 __init__.py
导入了它。通常,不要依赖此行为并明确导入子包。