Python __import__函数中的`globals`和`locals`参数是什么?

时间:2011-02-02 09:15:27

标签: python import

Python文档中有__import__的一部分,我不明白:

  

__import__(name[, globals[, locals[, fromlist[, level]]]])

     

该函数导入模块name,可能使用给定的globalslocals来确定如何解释包上下文中的name。标准实现根本不使用其locals参数,仅使用其globals来确定import语句的包上下文。

有什么“解释”模块名称?什么是包上下文?

使用这些参数的示例调用如下所示:

spam = __import__('spam', globals(), locals(), [], -1)

为什么示例会为函数提供globals()locals()?当我只提供globals()时会发生什么?或者都不是?

我可能遗漏了与导入模块有关的命名空间逻辑的某些部分。你能指点我一篇解释这个/有__import__函数的例子的文章吗?

3 个答案:

答案 0 :(得分:5)

  

标准实现根本不使用其locals参数,仅使用其globals来确定import语句的包上下文。

(来自docs.python.org

我仍然不知道如何使用globals;什么全局变量可以影响import语句的工作方式?

编辑:在Python 2.5源代码中查看import.c后,我发现__import__期望__name____path__找到globals 1}}为了相对于在这些变量之一中找到的路径增加导入搜索路径,按顺序。

答案 1 :(得分:2)

globals用于确定调用导入位置的当前上下文。例如:

"""
/myproject/a/b.py
/myproject/a/foo.py
/myproject/c/d.py
/myproject/c/foo.py
"""

# Which foo gets imported?

import foo #1
foo = __import__('foo') #2

它们不一样,因为在#2上没有(简单的)方法来知道从哪个模块调用导入。 __import__函数需要知道哪个是实际导入正确foo的当前模块。

__import__()内部,globals用于获取调用导入的当前模块的引用。来自__import__ source code

  

返回正在执行导入的包。如果是全局变量   从模块foo.bar.bat(本身不是一个包),这将返回   foo.bar的sys.modules条目。如果globals来自包的 init .py,   返回sys.modules中包的条目,作为借用的引用。

答案 2 :(得分:-2)

  

有什么“解释”模块名称?什么是包上下文?

当您输入

>>> a

Python必须“解释”该名称。它是全球性的吗?这是当地的吗?

>>> def f(x):
...    return x * a

现在,x显然是本地的。 a必须“解释”。全球?本地?

  

为什么示例为函数提供globals()和locals()?当我只提供globals()时会发生什么?或者都不是?

试一试,看看。认真。使用它比使用它更容易。

重要的是,您在>>>提示符处执行的操作是全局的。

您需要定义将创建本地上下文的函数,以便您可以看到全局和本地之间的差异。