任何人都可以帮助详细说明 Python 教程中的这一段吗? [复制]

Posted

技术标签:

【中文标题】任何人都可以帮助详细说明 Python 教程中的这一段吗? [复制]【英文标题】:Can anyone help elaborate on this paragraph in Python tutorial? [duplicate] 【发布时间】:2013-07-06 12:32:10 【问题描述】:

我是 Python 新手。最近我正在阅读Python Tutorial,我有一个关于“import *”的问题。教程是这样说的:

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

据我了解,from sound.effects import * 不应该是“全部导入 sound.effects”吗? “它只确保包 sound.effects” 已被导入”是什么意思?有人可以解释一下这一段,因为我现在真的很困惑?非常感谢。

【问题讨论】:

你了解包(相对于普通模块)的基础知识吗? 【参考方案1】:

“它只确保包sound.effects”已经被导入是什么意思?

导入模块意味着在文件内的最高缩进级别执行所有语句。这些语句中的大多数将是 def 或 class 语句,它们创建一个函数或类并为其命名;但如果有其他语句,它们也会被执行。

james@Brindle:/tmp$ cat sound/effects/utils.py
mystring = "hello world"

def myfunc():
    print mystring

myfunc()
james@Brindle:/tmp$ python
Python 2.7.5 (default, Jun 14 2013, 22:12:26)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sound.effects.utils
hello world
>>> dir(sound.effects.utils)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'myfunc', 'mystring']
>>>

在此示例中,您可以看到导入模块 sound.effects.utils 已在模块内部定义了名称“mystring”和“myfunc”,并在文件的最后一行定义了对“myfunc”的调用。

“导入包sound.effects”表示“导入(即执行)名为sound/effects/init.py的文件中的模块”。

当描述说

然后导入包中定义的任何名称

它(令人困惑地)对“导入”一词使用了不同的含义。在这种情况下,这意味着包中定义的名称(即 init.py 中定义的名称)被复制到包的命名空间中。

如果我们将之前的 sounds/effects/utils.py 重命名为 sounds/effects/__init__.py,会发生以下情况:

>>> import sound.effects
hello world
>>> dir(sound.effects)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'myfunc', 'mystring']
>>> locals()
'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'sound': <module 'sound' from 'sound/__init__.pyc'>, '__doc__': None, '__package__': None

和以前一样,myfuncmystring 已创建,现在它们位于 sounds.effects 命名空间中。

from x import y 语法将事物加载到本地命名空间而不是它们自己的命名空间,因此如果我们从 import sound.effects 切换到 from sound.effects import *,这些名称将被加载到本地命名空间:

>>> locals()
'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None
>>> from sound.effects import *
hello world
>>> locals()
'myfunc': <function myfunc at 0x109eb29b0>, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'mystring': 'hello world', '__name__': '__main__', '__doc__': None
>>>

【讨论】:

【参考方案2】:
    import file

    v = file.Class(...)

是你正常导入时必须做的,但是'from file import '*表示你可以不带关键字使用文件的所有内容。代替“*”,您可以指定特定的类等...

【讨论】:

【参考方案3】:

简单地说:

据我了解,from sound.effects import * 不应该是“在 sound.effects 下全部导入”的意思吗?

不,应该是import sound.effects,然后让其所有成员无条件可用。

换句话说,它是关于sound.effects成员,而不是它下面的任何模块或包。

如果sound.effects 是一个包,那么sound.effects.foo 的子模块或子包不会自动成为sound.effects 的成员。而且,如果它不是成员,则它不会在您的模块中可用。

那么,这个“不一定”的资格是怎么回事?好吧,一旦你import sound.effects.foo,它就会成为sound.effects 的成员。所以,如果你(或其他人——比如soundsound.effects)已经完成了import 的操作,那么sound.effects.foo from sound.effects import * 复制到你的模块中。

这就是最后一句中的括号部分的全部内容:

这包括由__init__.py 定义的任何名称(以及显式加载的子模块)。

【讨论】:

以上是关于任何人都可以帮助详细说明 Python 教程中的这一段吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

任何好的教程可以帮助我创建用于在 C、C++ 中随机化的头文件 [关闭]

Python简明教程

Python教程——7.python 字典

内存不足,仪器分配

在计算机启动时自动填写登录详细信息

Augustus安装教程