python - 如何获取函数名、函数参数
问题描述
我有以下代码:
run_in_background (
update_contacts(data={'email': email,'access_token': g.tokens['access_token']})
)
我创建了这个函数来在后台处理被调用的函数:
def run_in_background(function):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_in_executor(None, **function**, **data**)
我将如何检索函数和传递给它的数据?
解决方案
使用装饰器!
装饰器是一个将函数作为参数的包装器:
def decorate(func):
def wrapper(*args, **kwargs):
# *args and **kwargs are input vars passed to func() on its call
return f(*args, **kwargs)
return wrapper
@decorate
def func(arg1, arg2, **kwargs):
#do_things
在您的情况下,这看起来像:
def run_in_background(func):
def wrapper(*args, **kwargs):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
# remember, data is in *args (or **kwargs if it's a keyword arg)
loop.run_in_executor(None, func, data)
return None
return wrapper
@run_in_background
# data is an arg or positional arg here, but could easily be data=data
def update_contents(data):
# function logic
编辑:并不总是后台进程:
您可以更改装饰器以在背景之间切换:
def run_in_background(func):
def wrapper(*args, **kwargs):
if background:
# run in background
else:
func(data)
return None
return wrapper
@run_in_background
def update_contact(data, background=False):
#contact func logic
这将允许您保留装饰器并减少代码重复,同时让您可以灵活地指定是否需要后台进程
推荐阅读
- c# - 如何处理第三方代码中的死锁
- xcode - 如何更改 Mac 应用程序上的应用程序支持路径?
- chisel - Chisel:如何在 ChiselScalatestTester 中等待信号断言?
- xampp - Xampp 端口被另一个程序占用
- javascript - 从当前光标位置获取指定范围内的节点列表
- excel - Excel Power Pivot 中的连续运行总计
- momentjs - 无法正确获取天数
- javascript - 如何在窗口视图中将活动类添加到部分?
- javascript - 即使在安装反应文件查看器包后也找不到 FileViewer 模块
- javascript - 将对象中的值相乘并分配给新的数组对象