You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过字符串调用Python函数?求更多实现方法

通过字符串调用Python函数的其他实现方法

你已经尝试的有效方法包括:

  • 直接使用函数引用:func_ref()
  • 通过locals()字典获取函数并调用:locals()[func_name]()
  • 使用eval()执行函数名并调用:eval(func_name)()

以下是几种额外的可行方法:

1. 使用globals()字典调用全局函数

如果函数定义在全局作用域,globals()字典可以直接根据字符串键获取函数对象,用法和locals()类似:

globals()[func_name]()

2. 使用getattr()调用模块/类中的函数

getattr()是更安全的方式,适合调用模块内或类实例/类本身的函数:

# 调用当前模块中的函数
import sys
current_module = sys.modules[__name__]
getattr(current_module, func_name)()

# 调用类实例的方法
class DemoClass:
    def demo_method(self):
        print("method works!")

instance = DemoClass()
getattr(instance, "demo_method")()

3. 使用自定义函数注册表

自己维护一个函数名与函数对象的映射字典,这种方式完全可控,避免操作内置作用域字典的风险,尤其适合复杂项目:

# 初始化注册表并注册函数
func_registry = {}
func_registry["test_func"] = test_func

# 通过字符串调用
func_registry[func_name]()

4. 使用operator.attrgetter()

和getattr()功能类似,适合需要链式获取属性/方法的场景:

from operator import attrgetter
import sys

func = attrgetter(func_name)(sys.modules[__name__])
func()

注意事项

  • eval()存在安全风险,若字符串来源不可信,可能执行恶意代码,尽量避免使用。
  • locals()在嵌套作用域(比如函数内部)中可能无法正确获取全局函数,此时优先用globals()或getattr()。
  • 自定义注册表是最安全可控的方案,推荐在生产环境中使用。

内容的提问来源于stack exchange,提问作者john doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:26:05