0

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

4

1 回答 1

2

当你这样做

from whatever_package import *

首先,如果包__init__.py尚未运行,它将运行。(如果您已经完成import whatever_package.something_specific,则该软件包__init__.py将已经运行。)

然后,如果whatever_package.__init__未定义__all__列表,则导入将选取对象*的所有当前内容。whatever_package这将是__init__.py在程序中执行的任何代码已显式导入的任何内容以及任何子模块。例如,如果whatever_package's__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__列表的任何内容都是标准的,无论您是从包导入还是从普通模块导入。

于 2016-08-02T16:25:09.277 回答