【发布时间】:2015-10-11 12:37:35
【问题描述】:
此import 声明:
from tkinter import *
不导入tkinter.filedialog。为什么没有?
【问题讨论】:
标签: python tkinter namespaces python-import
此import 声明:
from tkinter import *
不导入tkinter.filedialog。为什么没有?
【问题讨论】:
标签: python tkinter namespaces python-import
tkinter 是一个包,当做from tkinter import * 时,它会为tkinter 包导入__init__.py 中定义的所有名称,以及仅在__all__ 中定义的模块和子包__init__.py 的 tkinter 包。
在我的 Python 3.4 中,tkinter/__init__.py 中没有定义 __all__,因此它不会从其中导入任何模块(如 filedialog)。
这在the documentation -中有解释
唯一的解决方案是包作者提供包的显式索引。 import 语句使用以下约定:如果包的
__init__.py代码定义了一个名为__all__的列表,则它被视为遇到 from package import * 时应导入的模块名称列表。如果未定义
__all__,则from sound.effects import *语句不会将sound.effects包中的所有子模块导入当前命名空间;它只确保包 sound.effects 已被导入(可能在__init__.py中运行任何初始化代码),然后导入包中定义的任何名称。这包括__init__.py定义的任何名称(以及显式加载的子模块)。
通常,从from <package> import * 导入的值取决于该包的__init__ 文件的__all__ 列表中指定的值。
无法导入filedialog 意味着它不包含在tkinter __init__ 文件的__all__ 列表中。
评估一个包是否“导出”某些子模块的快速方法是评估它是否在您import 之后具有__all__ 属性。如果是,它将返回可用的子模块,如果不是,则会引发 Attribute Error。
例如,对于像scipy这样的包:
import scipy
print(scipy.__all__) # prints all contents.
【讨论】: