如何将函数的参数变量传递给装饰器?

小写00

我基本上是在尝试跟踪 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,但我不会总是知道传递的是什么,而且我不需要每个参数,所以我不想得到一切。

VPfB

来自inspect模块的函数签名可以提供帮助。

使用包装函数的保存签名,您可以在每次调用时将参数绑定到它,并按名称查找它们,而不管类型(arg 或 kwarg)。

文档:内省可调用对象

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将参数传递给装饰器,在那里进行处理,然后传递给装饰函数?

如何将参数传递给类中的装饰器

如何将额外的参数传递给Python装饰器?

如何将参数传递给装饰器中的功能

如何将参数传递给 python 装饰器

如何将参数传递给方法装饰器

如何将类变量传递给参数化装饰器

如何将实例变量传递给TypeScript装饰器参数?

将参数传递给装饰器函数

如何将修饰器中的变量传递给修饰函数中的函数参数?

如何将参数作为函数传递给变量?

如何将参数/变量传递给casperjs评估函数

如何将 JavaScript 变量传递给 PHP 函数参数?

如何将变量或对象传递给 aiogram dp.message_handler 装饰函数?

如何将非硬编码参数传递给Python装饰器?

python flask如何将动态参数传递给装饰器

2.0中的气流dag和任务装饰器:如何将配置参数传递给任务?

Python:如何将变量传递到装饰器中,并且装饰器也将装饰器变量传递回函数中?

将命令行参数传递给调用带有装饰器参数的装饰函数的函数

如何将参数传递给函数?

在装饰器中分配时如何将 self 传递给函数实例?

如何将变量传递给函数

装饰器如何在不更改其签名的情况下将变量传递给函数?

如何将一个类的实例作为参数传递给装饰该类中定义的实例方法的装饰器?

如何将类属性传递给方法装饰器?

如何将PK传递给方法装饰器

如何将changeDetectorRef传递给装饰器?

调用内部/装饰函数时,可以将参数传递给装饰器函数吗?

将参数传递给类装饰器