导入包中的模块在显式导入之前是不可见的

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 导入了它。通常,不要依赖此行为并明确导入子包。