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

result when __all__ is not defined in __init__.py of package?

我只是在学习和练习 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 模块,所以在执行第二个导入语句后究竟发生了什么,我在阅读提到的 link 后没有得到概念。

当你这样做时

from whatever_package import *

首先,如果包裹的 __init__.py 还没有 运行,它将是 运行。 (如果你已经完成了 import whatever_package.something_specific,包裹的 __init__.py 将已经 运行。)

然后,如果 whatever_package.__init__ 没有定义 __all__ 列表,导入将获取 whatever_package 对象的所有 current 内容*。那将是 __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.


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