在包的__init__.py中未定义__all__的结果?

时间:2016-08-02 16:02:08

标签: python mkv

我正在学习和练习python,在路上,我正在阅读有关python包以及如何导入到Modules的其他模块或包中,我假设以下场景,

我有包裹,

Video/
    __init__.py
    formats/
        __init__.py 
        mkv.py  
        mp4.py
    length/
        __init__.py
        morethan20min.py
        lessthan20min.py

并且没有

__init__.py

我还没有定义

__all__

如果我的导入语句为

,会发生什么
import Video.format.mkv
import Video.formats.* 

由于我已经在第一个语句中导入了mkv模块,执行第二个import语句后到底发生了什么,我在阅读了上述链接后没有得到这个概念。

1 个答案:

答案 0 :(得分:2)

当你这样做时

from whatever_package import *

首先,如果包__init__.py尚未运行,则会运行。 (如果您已经完成了import whatever_package.something_specific,那么该套件的__init__.py就已经运行了。)

然后,如果whatever_package.__init__未定义__all__列表,则导入将获取whatever_package对象*的所有当前内容。这将是__init__.py中定义的任何内容以及已由程序中执行的任何代码显式导入的任何子模块。例如,如果whatever_package' __init__.py为空,则执行

import whatever_package.something_specific
from whatever_package import *
import whatever_package.other_thing

并且您的计划中不存在与whatever_package相关的其他导入声明,然后import *会选择something_specific,而不是whatever_package的任何其他子模块,例如other_thing

*不包括任何以下划线开头的内容,这是任何import *没有__all__列表的标准内容,无论您是从包还是普通模块导入。