python中可以直接将函数定义作为参数传入,但有些情况将函数定义传入是不方便的,替代的方案是传入函数的名称,然后通过eval函数调用。
模块文件lib.py
import sys
def run_func(func_name):
caller_globals = sys._getframe(1).f_globals
f = eval(func_name, caller_globals)
f()
测试文件test.py
from lib import run_func
def bar():
print("hello world")
run_func("bar")
执行
$ python test.py
hello world
说明:
1) sys._getframe(1)表示的是从python运行时堆栈中取call frames(可以理解问Python的上下文,即域里的所有变量,函数定义也属于变量),1为取的堆栈深度,表示从栈顶往下取,取到栈顶下面的那层。
2)这里堆栈深度不能设置为0,也不能设置为大于1的值,设置为0的话,只能取到模块内定义的函数,设置为大于1的值的话,可能会超出栈深度,引发ValueError: call stack is not deep enough的错误
sys.
_getframe
([depth])Return a frame object from the call stack. If optional integer depth is given, return the frame object that many calls below the top of the stack. If that is deeper than the call stack,
ValueError
is raised. The default for depth is zero, returning the frame at the top of the call stack.