有人可以用简单的英语解释这个小片段究竟是什么以及为什么会这样:
def foo():
print "You are calling a function via a variable"
var='foo'
fun_var = globals()[var]
print fun_var # it says `<function list>`
print type(fun_var) # it says `<type 'function'>`
fun_var() # it actually prints out "You are calling a function via a variable"
我知道通过一些魔法globals()
获取var
的值并创建一个与该值同名的函数。我也明白,如果我们不知道var
的价值(例如,它可能由用户设置)并且我们有一些功能,这可能是一个很好的解决方法,其中一个我们&# 39; d喜欢根据该值进行呼叫(例如根据用户的偏好)。
然而,整个过程仍然看起来有点像奇迹:)。 globals()究竟是做什么的?这些权力来自哪里? :)
谢谢。
答案 0 :(得分:3)
实际上...
在这里你创建一个名为'foo'的函数,它打印一个字符串
def foo():
print "You are calling a function via a variable"
在这里,您将字符串'foo'分配给变量'var'
var='foo'
globals()返回一个全局定义的dict,你可以通过一个键访问它,在这种情况下'foo'返回fun_var foo函数的地址
fun_var = globals()[var]
然后你可以看到foo函数属性
print fun_var # it says `<function list>`
print type(fun_var) # it says `<type 'function'>`
然后你调用foo函数puts()
fun_var() # it actually prints out "You are calling a function via a variable"
这与:
相同def foo():
print('Hello')
fun_var = foo
fun_var() # Prints 'Hello'
答案 1 :(得分:1)
这不是那么神奇。 globals()
是包含所有全局变量和函数声明的字典,格式为{ key: value }
,其中函数或变量的名称为key
,实际函数或变量值为value
。只要有字典,就可以使用dict["key"]
来询问密钥的值。因此,当您询问具有键的事物的值(读取:名称)foo
时,您将返回名为foo
的函数,因为这是globals()
中绑定的名称
那就是说,如果你绝对必须,只会混淆globals()
。搞乱Python内置是一个危险的游戏。
答案 2 :(得分:1)
globals()返回全局命名空间中所有对象的字典。
globals()['key']
为您提供映射到字典中键的对象。
您正在传递函数foo
的键,字典会返回对该函数的引用,然后您将该函数绑定到变量。
没有魔法。
答案 3 :(得分:0)
globals()是所有全局可访问对象的字典。您通过将其名称作为该字典的键来访问您的函数。