导入全部不导入所有

时间:2015-10-11 12:37:36

标签: python tkinter namespaces python-import

import声明:

from tkinter import *

不会导入tkinter.filedialog。为什么不呢?

2 个答案:

答案 0 :(得分:4)

tkinter是一个包,在执行from tkinter import *时,它会导入__init__.py中为tkinter包定义的所有名称,以及仅导出模块和子包在__all__ __init__.py包中的tkinter中定义。

在我的Python 3.4中,__all__中没有定义tkinter/__init__.py,因此它不会从其中导入任何模块(如filedialog)。

the documentation -

中对此进行了解释
  

唯一的解决方案是让包作者提供包的显式索引。 import语句使用以下约定:如果包的__init__.py代码定义了名为__all__的列表,则它将被视为遇到包import *时应导入的模块名称列表。< / p>      

如果未定义__all__,则sound.effects import *中的语句不会将包sound.effects中的所有子模块导入当前名称空间;它只确保已导入包sound.effects(可能在__init__.py中运行任何初始化代码),然后导入包中定义的任何名称。这包括__init__.py定义的任何名称(以及显式加载的子模块)。

答案 1 :(得分:1)

通常,从from <package> import *导入的值取决于该程序包的__all__文件的__init__列表中指定的值。

无法导入filedialog表示它未包含在__all__ tkinter文件的__init__列表中。

评估包“导出”某些子模块的快速方法是在__all__之后评估它是否具有import属性。如果是,它将返回可用的子模块,否则将引发Attribute Error

例如,对于像scipy这样的包:

import scipy
print(scipy.__all__) # prints all contents.