Python导入函数中的'globals'和'locals'参数用于什么?
Python文档中有一部分我不理解:Python导入函数中的'globals'和'locals'参数用于什么?,python,import,Python,Import,Python文档中有一部分我不理解: \uuuu导入(名称[,全局[,局部[,来自列表[,级别]]]) 函数导入模块名称,可能使用给定的全局和局部来确定如何在包上下文中解释名称。标准实现根本不使用其locals参数,而仅使用其globals来确定导入语句的包上下文 模块名有什么可“解释”的?什么是包上下文 使用这些参数的示例调用如下所示: spam = __import__('spam', globals(), locals(), [], -1) 为什么示例为函数提供了globals()和lo
\uuuu导入(名称[,全局[,局部[,来自列表[,级别]]])
函数导入模块名称
,可能使用给定的全局
和局部
来确定如何在包上下文中解释名称
。标准实现根本不使用其locals
参数,而仅使用其globals
来确定导入语句的包上下文
模块名有什么可“解释”的?什么是包上下文
使用这些参数的示例调用如下所示:
spam = __import__('spam', globals(), locals(), [], -1)
为什么示例为函数提供了globals()
和locals()
?如果我只提供globals()
,会发生什么情况?或者两者都没有
我可能缺少与导入模块相关的命名空间逻辑的某些部分。你能给我指一篇文章来解释这一点吗?它有\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
标准实现根本不使用其locals
参数,而仅使用其globals
来确定import
语句的包上下文
(来自)
我仍然不知道如何使用globals
;什么全局变量会影响import
语句的工作方式
EDIT:在查看Python 2.5源代码中的import.c
后,我发现\uuuuuuuuuuuuuu
期望在globals
中找到\uuuuuuuuuuu name>或\uuuuuuuuuuuuuuuuuuuuuuuuuu路径>以增加相对于在这些变量中找到的路径的导入搜索路径
模块名有什么可“解释”的?什么是包上下文
当你进入
>>> a
Python必须“解释”这个名称。这是一个全球性的问题吗?是本地的吗
>>> def f(x):
... return x * a
现在,x
显然是本地的<代码>必须进行“解释”。全球的?本地的
为什么示例为函数提供globals()和locals()?当我只提供globals()时会发生什么?或者两者都没有
试试看。认真地玩它比问它容易
重要的是,您在>>
提示符下所做的事情是全局性的
您需要定义将创建本地上下文的函数,以便查看全局上下文和本地上下文之间的差异。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上没有(简单的)方法知道从哪个模块调用导入。\uuuu import\uuuu
函数需要知道实际导入正确的foo
的当前模块
在\uuuuu import\uuuuuu()
内部,使用globals
获取调用导入的当前模块上的引用。从\uuuu导入\uuuuu
:
返回正在其中执行导入的包。如果globals来了
从模块foo.bar.bat(本身不是包)返回
foo.bar的sys.modules条目。如果globals来自包的init.py,
返回sys.modules中的包条目,作为借用的引用
这个问题不应该转移到StackOverflow吗?这很有趣,我是在SO开始写这篇文章的,但我正在考虑是否应该把它发布到programmers.SE上。。。我显然需要看看常见问题解答…您应该选择以下答案之一作为此问题的公认答案。IMHO,9000的答案一针见血,它解释了Python如何使用globals
来确定模块名称空间。残酷有趣的事实是,正在导入的模块几乎忽略了进行导入的模块的全局值,而\u import\u
完全忽略了locals
参数。否则,您是正确的:)假设在b.py
和d.py
中有import foo
。Python怎么不知道要导入哪一个?在b.py
的情况下,为什么它会在/c
/中查找foo
?如果在/myproject/e.py
中有导入foo
,那么它就不应该工作。import a.foo
或import c.foo
。我很抱歉。。。我似乎无法举出一个会“制造麻烦”的例子,你能给我一个提示吗?谈谈迟钝。因此,基本上,不需要传递包含所有全局变量的巨大内存块(假设Python不通过引用来传递),只需传递一个dict键,“\uuuuu name\uuuuu”
,设置为调用模块的\uu name\uuuuu
属性,Python就可以使用它。Python文档应该用这些信息更新。@Kumba:假设Python除了一些基本的数字操作外,几乎所有操作都是通过引用来完成的。口述绝对是通过引用来传递的。Python3.3甚至引入了共享键的DICT实现,也就是说,键也是通过引用访问的。如果你想抱怨的话,那就谈谈缓存一致性:)在实际使用(并拥有)非缓存一致性硬件之后,我只能开始想象那场噩梦。谢天谢地(或者很遗憾,你可以选择),我用Python编写的代码必须至少在Python2.4上运行。我避免使用3.x,因为我知道它完全终结了语言,我的许多代码可能无法在没有认真重写的情况下工作。