python - 将装饰器函数合并为类

标签 python class arguments decorator keyword-argument

需要创建一个类来执行“合并”功能的所有操作。在类里面我将更改、处理并添加新的参数。

def merge(*arg, **kwarg): # get decorator args & kwargs
    def func(f):
        def tmp(*args, **kwargs): # get function args & kwargs    
            kwargs.update(kwarg) # merge two dictionaries
            return f(*args, **kwargs) # return merged data
        return tmp
    return func

用法:

@other_decorator # return *args and **kwarg
@merge(list=['one','two','three']) # need to merge with @other_decorator
def test(*a, **k): # get merged args and kwargs
    print 'args:', a
    print 'kwargs:', k

最佳答案

我不确定我是否完全明白你的问题。您的实现工作正常,如果您想创建任何类型的参数化装饰器,您将无法绕过两级间接。

要使合并成为一个类,您可以这样做

class Merge(object):
    def __init__(self, **extra_kws):
        self.extra_kws = extra_kws
    def __call__(self, function):
        def _wrapper(*args, **kws):
            kws.update(self.extra_kws)
            return function(*args, **kws)
        return _wrapper

然后你可以这样做:

@Merge(foo='bar')
def test(*args, **kws):
    print *args
    print **kws

但是您说您想要添加更改并处理新参数。因此,大概您希望装饰器本身处于事件状态,这样您就可以执行以下操作:

test.extra_kws['sun'] = 'dock'

应用装饰器后。在这种情况下,您可能不希望 merge 成为一个类,但您希望它生成一个类,以便 test 被可修改的实例替换:

def merge(**extra_kws):
    class _Merge(object):
        def __init__(self, function):
            self.extra_kws = extra_kws
            self.function = function
        def __call__(self, *args, **kws):
            kws.update(self.extra_kws)
            return self.function(*args, **kws)
    return _Merge

@merge(foo='bar')
def test(*args, **kws):
    print 'args:', args
    print 'kws:', kws

test(sun='dock')
test.extra_kws['trog'] = 'cube'
test(sun='dock')

这允许您稍后更改特定修饰函数上的关键字。

您也可以使用不带类的函数参数执行相同的操作:

def merge(**extra_kws):
    def _decorator(function):
        def _wrapper(*args, **kws):
            kws.update(_wrapper.extra_kws)
            return function(*args, **kws)
        _wrapper.extra_kws = extra_kws
        return _wrapper
    return _decorator

@merge(foo='bar')
def test(*args, **kws):
    print 'kws:', kws

test(sun='dock')
test.extra_kws['trog'] = 'cube'
test(sun='dock')

关于python - 将装饰器函数合并为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2754363/

相关文章:

制作一个可以接受可迭代或任意数量参数的函数的 Pythonic 方法?

java - 如何使用文件中的不同命令行参数运行同一个 java 程序

c++ - 在linux中通过C++(或python)访问多个键盘输入

python - Matplotlib:每个时间序列子图绘制多行

php - 警告 : require_once(): failed to open stream: No such file or directory in

php - 调用非对象的成员函数 InnerJoin()

C++ 类指针不保存任何内容。

.net - 在参数中传递列表(字符串)值

python - 在 R 和 pandas 中合并并保持顺序

python - 如何显示用箭袋创建的箭头图例?