python中模块中调用用户自定义函数

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.

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值