Python: 将变量值转换为函数名?
有人能用简单的语言解释一下这段代码到底在干什么吗?
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
的值(比如这个值可能是用户设置的),而我们有一些函数,其中一个函数的调用取决于这个值(比如根据用户的偏好),这可能是一个不错的解决办法。
不过,这整个过程对我来说还是有点像魔法一样。globals()
到底在这里做了什么?这些能力是从哪里来的呢?
谢谢。
4 个回答
globals() 是一个字典,里面存放着所有可以全局访问的对象。你通过把函数的名字当作这个字典的键来访问你的函数。
globals() 是一个函数,它会返回一个字典,这个字典里包含了你所有的全局变量。
用 globals()['key']
可以获取字典中与某个键对应的对象。
你传入的是函数 foo
的名字,字典就会返回这个函数的引用,然后你可以把它赋值给一个变量。
这其中没有什么神秘的地方。
其实这并没有什么神奇的地方。globals()
是一个字典,里面包含了所有全局变量和函数的声明,格式是 { 键: 值 }
。这里的“键”就是变量或函数的名字,而“值”就是它们实际的内容。每当你有一个字典时,可以通过 dict["键"]
来获取对应的值。所以当你想要获取名为 foo
的东西的值时,你就会得到名为 foo
的函数,因为在 globals()
中,这个名字就是和这个函数绑定在一起的。
不过,只有在你真的需要的时候才去动 globals()
。随便改动 Python 的内置功能是很危险的事情。
其实...
这里你定义了一个叫做 'foo' 的函数,它会打印出一个字符串。
def foo():
print "You are calling a function via a variable"
接着,你把字符串 'foo' 赋值给一个变量 'var'。
var='foo'
globals() 会返回一个包含全局定义的字典,你可以通过键来访问它,这里用 'foo' 来获取 foo 函数的地址,并把它赋值给 fun_var。
fun_var = globals()[var]
然后你可以查看 foo 函数的属性。
print fun_var # it says `<function list>`
print type(fun_var) # it says `<type 'function'>`
接下来,你可以通过加上 () 来调用 foo 函数。
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'