python会使用from * import *在packages namespace中添加名称吗?

时间:2014-03-13 12:25:23

标签: python syntax python-import

假设我们有一个名为' package'的软件包,它有一个模块'模块'。

如果我们

  来自包导入模块的

因为' package'已加载,包的本地名称空间将有一个名称'模块'?

我们可以在参考' import'

中看到这样的词组
  

第一种形式的import语句绑定本地的模块名称   命名空间到模块对象,然后继续导入下一个   标识符,如果有的话。如果模块名称后跟as,则为名称   以下用作模块的本地名称。

     

from表单不绑定模块名称:它遍历列表   标识符,在步骤中找到的模块中查找每个标识符   (1),并将本地名称空间中的名称绑定到对象   找到。与第一种导入形式一样,备用本地名称也可以   通过指定“as localname”来提供。如果找不到名字,   引发了ImportError。如果标识符列表被替换为   star(' *'),模块中定义的所有公共名称都绑定在   import语句的本地命名空间..

它是什么意思" from表单不绑定模块名称"在第二段?

1 个答案:

答案 0 :(得分:1)

是的,package.__init__模块可以访问名称module

$ mkdir package
$ touch package/__init__.py
$ touch package/module.py
$ python
Python 2.7.5 (default, Oct 28 2013, 20:45:48) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from package import module
>>> import sys
>>> sys.modules['package']
<module 'package' from 'package/__init__.py'>
>>> dir(sys.modules['package'])
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'module']
>>> sys.modules['package'].module
<module 'package.module' from 'package/module.py'>

您引用的第二段讨论了from foo import bar import语句绑定的名称。 bar受约束,foo不受约束。或者,就上述演示而言:

>>> module
<module 'package.module' from 'package/module.pyc'>
>>> package
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'package' is not defined

from package import module语句为命名空间添加了module名称,但package未绑定。