【问题标题】:Unexpected behavior with loading a module in Python在 Python 中加载模块时出现意外行为
【发布时间】:2013-08-16 16:26:24
【问题描述】:

据我了解,from module import * 表示该模块中的所有内容都将在本地可用。

在我的代码中我发现:

from tkinter import *

from tkinter import filedialog

回想起来,我想我可以删除最后一行,但它不可用:

NameError: name 'filedialog' is not defined.

我错过了什么?

【问题讨论】:

  • 为了简短起见,这是你的答案:[filedialog is a module of tkinter][1] [1]: stackoverflow.com/questions/9239514/…
  • * 导入确实导入子模块。它只是导入选定的包并将所有内容放在全局命名空间中。 import tkinterfrom tkinter import * 在“加载的东西”上没有区别,区别在于后者会污染命名空间。如果__init__.py 文件没有导入子模块,那么您必须 显式导入它们(这似乎是这种情况)。

标签: python python-3.x module tkinter


【解决方案1】:

据我了解,Tkinter 是一个包(这意味着它包含其他模块)。 From Tkinter import * 只会给你默认的模块。

来自文档:

6.4.1。从包中导入 *

现在当用户从 sound.effects import * 写入时会发生什么?理想情况下,人们希望它以某种方式传递到文件系统,找到包中存在哪些子模块,然后将它们全部导入。这可能需要很长时间,并且导入子模块可能会产生不必要的副作用,这些副作用只有在显式导入子模块时才会发生。

唯一的解决方案是包作者提供包的显式索引。 import 语句使用以下约定:如果包的 init.py 代码定义了一个名为 all 的列表,则它被认为是应该在何时导入的模块名称列表遇到 from package import *。当包的新版本发布时,由包作者保持这个列表是最新的。包作者也可能决定不支持它,如果他们没有看到从他们的包中导入 * 的用途。例如,sounds/effects/init.py 文件可能包含以下代码:

请阅读以下帖子以获得您问题的另一个答案。 filedialog, tkinter and opening files

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2021-04-01
    相关资源
    最近更新 更多