2011-02-02 42 views
8

还有的__import__ Python文档中的一部分,这一点我不明白:什么是Python的__import__函数中的`globals`和`locals`参数?

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

功能导入模块name,可能使用给定globalslocals,以确定如何解释name在包装上下文中。标准实现完全不使用locals参数,并且仅使用它的globals来确定导入语句的包上下文。

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

使用这些参数的示例调用看起来是这样的:

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

为什么例子提供globals()locals()的功能?当我只提供globals()会发生什么?或者既不?

我可能错过了某些与导入模块有关的名称空间逻辑部分。你能不能指出一篇文章解释这个/有__import__函数的例子?

+1

不应该将此问题移至StackOverflow吗? – EOL 2011-02-02 09:52:12

+0

这很有趣,我开始在SO上写这个,但是在想我是否应该把它发布在程序员上。相反......我显然需要看FAQ ...... – 2011-02-02 09:56:18

+0

你应该选择以下答案之一作为接受这个问题的答案。恕我直言,9000的答案通过解释Python使用`globals`来确定模块名称空间来解决问题。 – Kumba 2012-10-16 04:14:56

回答

4

标准实现不使用它的locals参数所有,并使用其globals只确定import语句的包环境。

(从docs.python.org

我仍然不知道如何globals被使用;什么样的全球变量可以影响import声明的工作方式?

编辑:在Python 2.5源代码看着import.c后,我发现,__import__希望能够找到或者在globals__name____path__以进口搜索路径相对于这些变量中的一个找到的路径(S)增加,以该顺序。

0

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

当你进入

>>> a 

的Python必须 “解释” 这个名字。这是全球性的吗?这是一个本地?

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

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

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

试试看看。认真。玩它比玩它更容易。

重要的是,你在>>>提示中所做的事情是全局性的。

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

1

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(本身不是一个包),这个返回的 sys.modules中的条目foo.bar。如果全局变量来自程序包的init .py, ,那么sys.modules中的程序包条目将作为借用的引用返回。

相关问题