对导入及其使用方法的困惑
Confusion on import and how to use it
我是 python 的新手,我对导入方法有些困惑。
我认为如果我这样做:
from tkinter import *
我应该可以使用:
filedialog.askopenfilename
但是,它给出了一个错误,指出未解决的引用。
如果我这样做:
from tkinter import filedialog
filedialog.askopenfilename
它工作正常,我明白为什么会这样。但是,我不明白为什么 Python 不让我用 from tkinter import *
做 filedialog.askopenfilename
阅读 this and this 以更深入地了解 from <foo> import *
的工作原理。
有两种不同的 from
目标:模块和包。
- 一个模块是一个单一的python文件。如果您
import *
来自模块,它会导入所有内容,除了以“_”开头的私有名称。
- A package 是文件夹,如 tkinter。如果您
import *
来自一个包,它会导入其 __init__.py
中存在的所有名称。如果 __init__.py
不存在,则不导入任何内容。
在这两种情况下,import *
的行为都可以通过定义 __all__
来覆盖。
tkinter 是一个文件夹(=包)并且在其 __init__.py
中未定义 __all__
,因此 from tkinter import *
仅在其 __init__.py
中导入名称,例如 Tk
、Button
或 Label
,但不是 filedialog
。
我是 python 的新手,我对导入方法有些困惑。
我认为如果我这样做:
from tkinter import *
我应该可以使用:
filedialog.askopenfilename
但是,它给出了一个错误,指出未解决的引用。
如果我这样做:
from tkinter import filedialog
filedialog.askopenfilename
它工作正常,我明白为什么会这样。但是,我不明白为什么 Python 不让我用 from tkinter import *
filedialog.askopenfilename
阅读 this and this 以更深入地了解 from <foo> import *
的工作原理。
有两种不同的 from
目标:模块和包。
- 一个模块是一个单一的python文件。如果您
import *
来自模块,它会导入所有内容,除了以“_”开头的私有名称。 - A package 是文件夹,如 tkinter。如果您
import *
来自一个包,它会导入其__init__.py
中存在的所有名称。如果__init__.py
不存在,则不导入任何内容。
在这两种情况下,import *
的行为都可以通过定义 __all__
来覆盖。
tkinter 是一个文件夹(=包)并且在其 __init__.py
中未定义 __all__
,因此 from tkinter import *
仅在其 __init__.py
中导入名称,例如 Tk
、Button
或 Label
,但不是 filedialog
。