【问题标题】:Will python add name in packages namespace with from * import *?python会用from * import *在包命名空间中添加名称吗?
【发布时间】:2014-03-13 12:25:22
【问题描述】:

假设我们有一个名为“package”的包,它有一个模块“module”。

如果我们

从包导入模块

既然 'package' 被加载,那么 package 的本地命名空间会不会有一个名字 'module'?

我们可以在'import'的引用中看到这样的短语:

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

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

第二段“from表单不绑定模块名”是什么意思?

【问题讨论】:

    标签: python syntax python-import


    【解决方案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 未绑定。

    【讨论】:

    • 如果您愿意,请查看我的问题中的新问题。谢谢
    • 请不要随意更改您的问题。该行讨论了对您要导入的命名空间的影响。 from bar import foo 绑定只是 foo,也不会有bar 名称。在我的回答中,module 已绑定,package 未绑定。
    猜你喜欢
    • 2019-09-19
    • 2010-10-26
    • 2012-05-31
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    相关资源
    最近更新 更多