作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我基本上是在尝试跟踪 API 中的事件。
有几条具有不同功能的路线。
我带来了这样的东西:
# defining a decorator like this:
class tracker():
def __init__(self, data):
self.data = data
def __call__(self, function):
@functools.wraps(function)
async def decorated(*args, **kwargs):
self.save_event(*args, **kwargs)
return await function(*args, **kwargs)
return decorated
def save_event(self, *args, **kwargs):
this_would_be_function_arg = self.data
# do something with the data
pass
# to be used like this:
@tracker(data=function_arg):
def my_func(function_arg):
# something...
pass
是否可以?我知道我可以从
kwargs
访问,但我并不总是知道传递了什么,而且我不需要每个参数,所以我不想得到所有东西。
最佳答案
来自 inspect
的函数签名模块可以提供帮助。
使用已保存的包装函数签名,您可以在每次调用时将参数绑定(bind)到它,并按名称查找它们,而不管类型(arg 或 kwarg)如何。
文档:introspecting callables
import inspect
import functools
class tracker():
def __init__(self, data):
self.data = data
self.signature = None
def __call__(self, function):
self.signature = inspect.signature(function)
@functools.wraps(function)
def decorated(*args, **kwargs):
bound = self.signature.bind(*args, **kwargs)
bound.apply_defaults()
self.save_event(bound.arguments[self.data])
return function(*args, **kwargs)
return decorated
def save_event(self, value):
print(f"called with {self.data}={value}")
@tracker(data='function_arg')
def my_func(arg1, function_arg=None):
pass
my_func(0,10)
my_func(10, function_arg=20)
my_func(-1)
# output:
# called with function_arg=10
# called with function_arg=20
# called with function_arg=None
关于python - 如何将函数的参数变量传递给装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68417838/
我是一名优秀的程序员,十分优秀!