Python文档中有__import__
的一部分,我不明白:
__import__(name[, globals[, locals[, fromlist[, level]]]])
该函数导入模块
name
,可能使用给定的globals
和locals
来确定如何解释包上下文中的name
。标准实现根本不使用其locals
参数,仅使用其globals
来确定import语句的包上下文。
有什么“解释”模块名称?什么是包上下文?
使用这些参数的示例调用如下所示:
spam = __import__('spam', globals(), locals(), [], -1)
为什么示例会为函数提供globals()
和locals()
?当我只提供globals()
时会发生什么?或者都不是?
我可能遗漏了与导入模块有关的命名空间逻辑的某些部分。你能指点我一篇解释这个/有__import__
函数的例子的文章吗?
答案 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()时会发生什么?或者都不是?
试一试,看看。认真。使用它比使用它更容易。
重要的是,您在>>>
提示符处执行的操作是全局的。
您需要定义将创建本地上下文的函数,以便您可以看到全局和本地之间的差异。