Python通过字符串调用函数或方法的三种实现方式
本文介绍Python中如何通过字符串动态调用函数或方法。针对字符串无法直接调用的问题,详细解析了eval、globals/locals字典访问以及getattr内建函数三种实现方案,对比了各方法的功能与安全性,帮助开发者选择合适的方式。
前言
本文主要介绍了在Python中通过字符串调用函数或方法的相关技术,供读者参考学习。下文将展开详细介绍。
首先来看一个具体场景:
>>> def foo():
print "foo"
>>> def bar():
print "bar"
>>> func_list = ["foo","bar"]
>>> for func in func_list:
func()
TypeError: 'str' object is not callable
假设我们需要遍历执行列表中的函数,但列表中存储的是函数名的字符串。此时直接尝试调用会抛出类型错误,因为字符串对象本身不具备可调用性。如果我们希望将字符串转换为可调用对象,或者希望通过变量名动态访问模块属性及类的属性,该如何实现?
以下提供三种可行的实现方法。
eval()函数
>>> for func in func_list:
eval(func)()
foo
bar
eval()通常用于执行一个字符串形式的表达式,并返回表达式的结果。在此场景下,它可以将字符串转换为对应的函数并执行。尽管eval()功能强大,但因其存在安全风险(常被称为“eval is evil”),一般不建议在生产环境中使用。
locals()和globals()函数
>>> for func in func_list:
locals()[func]()
foo
bar
>>> for func in func_list:
globals()[func]()
foo
bar
locals()和globals()是Python的两个内置函数,它们允许以字典的形式访问局部变量和全局变量。
getattr()函数
getattr()是Python的内建函数,其用法getattr(object, name)等价于访问object.name,但这里的name可以是一个变量。
获取foo模块中的bar方法
>>> import foo >>> getattr(foo, 'bar')()
获取Foo类的属性
>>> class Foo:
def do_foo(self):
...
def do_bar(self):
...
>>> f = getattr(foo_instance, 'do_' + opname)
>>> f()
总结
以上就是本文的全部内容,希望这些内容能对各位的学习或工作有所帮助。如有任何疑问,欢迎留言交流,感谢大家对本站的支持。
参考
Calling a function of a module from a string with the function's name in Python
How do I use strings to call functions/methods?
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













