Python: 将变量值转换为函数名?

1 投票
4 回答
1682 浏览
提问于 2025-04-18 13:34

有人能用简单的语言解释一下这段代码到底在干什么吗?

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 个回答

0

globals() 是一个字典,里面存放着所有可以全局访问的对象。你通过把函数的名字当作这个字典的键来访问你的函数。

1

globals() 是一个函数,它会返回一个字典,这个字典里包含了你所有的全局变量。

globals()['key'] 可以获取字典中与某个键对应的对象。

你传入的是函数 foo 的名字,字典就会返回这个函数的引用,然后你可以把它赋值给一个变量。

这其中没有什么神秘的地方。

1

其实这并没有什么神奇的地方。globals() 是一个字典,里面包含了所有全局变量和函数的声明,格式是 { 键: 值 }。这里的“键”就是变量或函数的名字,而“值”就是它们实际的内容。每当你有一个字典时,可以通过 dict["键"] 来获取对应的值。所以当你想要获取名为 foo 的东西的值时,你就会得到名为 foo 的函数,因为在 globals() 中,这个名字就是和这个函数绑定在一起的。

不过,只有在你真的需要的时候才去动 globals()。随便改动 Python 的内置功能是很危险的事情。

4

其实...

这里你定义了一个叫做 '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'

撰写回答