任何人都可以帮助在Python教程中详细说明这一段吗?

时间:2013-07-09 02:52:04

标签: python

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

  

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

定义的任何名称(以及显式加载的子模块)

根据我的理解,不应该来自sound.effects import * 意味着“全部导入sound.effects”?什么“它只能确保包声音效果”已被导入“是什么意思?有人可以解释这一段,因为我现在真的很困惑吗?非常感谢。

3 个答案:

答案 0 :(得分:2)

  

什么“它只能确保包声音效果”已被导入“是吗?”

导入模块意味着执行文件内顶部缩进级别的所有语句。这些语句中的大部分都是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”的文件中导入(即执行)模块。

说明时

  

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

它(令人困惑)对“import”这个词使用了不同的含义。在这种情况下,它意味着包中定义的名称(即 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}
>>>

答案 1 :(得分:0)

    import file

    v = file.Class(...)

如果正常导入它,你需要做什么,但是'from file import ' *意味着你可以使用没有关键字的文件的所有内容。而不是'*',您可以指定特定的类等...

答案 2 :(得分:0)

简言之:

  

根据我的理解,不应该from sound.effects import *意味着“全部导入声音效果”?

不,它应该是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定义的任何名称(以及显式加载的子模块)。