import *和__all__如何处理子模块导入

时间:2016-05-13 01:36:33

标签: python import packages

教程(第4段,https://docs.python.org/3/tutorial/modules.html#importing-from-a-package)提到:

  

它还包括显式包的任何子模块   由以前的import语句加载。请考虑以下代码:

import sound.effects.echo
import sound.effects.surround
from sound.effects import *
  

在此示例中,回显和环绕模块将导入   当前命名空间,因为它们是在sound.effects中定义的   执行from ... import语句时的包。 (这也有效   定义__all__时。)

疑惑:

  1. 在第一个声明中,previous import statements指的是哪个?
  2. 我无法理解陈述和例子。除from sound.effects import * __all__中的__init__.py中定义外,post不应导入任何内容。

1 个答案:

答案 0 :(得分:1)

  1. previous import statements指的是:

    import sound.effects.echo
    import sound.effects.surround
    
  2. 根据CPython 3.6,from sound.effects import *仅导入__init__.py中加载的子模块(通过定义__all__)。这意味着,如果未定义echo,则无法在surround__all__中使用符号。

  3. 否则,

      

    它还包括由以前的import语句显式加载的包的所有子模块。

    仅在__all__的{​​{1}} sound.effects __init__.py中定义__all__ = ["echo", "surround", "reverse"]时才有效。