首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python装饰器,添加了与Python2和Python3兼容的关键字参数

Python装饰器,添加了与Python2和Python3兼容的关键字参数
EN

Stack Overflow用户
提问于 2018-09-06 00:39:47
回答 1查看 42关注 0票数 2

我正在编写一个装饰器,它将关键字参数添加到包装函数中。在本例中,装饰器添加了关键字deco0deco1

代码语言:javascript
复制
def my_decorator(f):
    def inner(arg0, *args, deco0='deco0', deco1='deco1', **kwargs):
        """We assume decoarted functions will take at least one positional arg0"""
        print("Decorated({}, {})".format(deco0, deco1))
        return f(arg0, *args, **kwargs)
    return inner

@my_decorator
def add2(x):
    return x + 2

@my_decorator
def my_mult(x, y):
    return x * y

if __name__ == '__main__':
    print(add2(5))
    print(add2(5, deco0='BLA'))
    print(my_mult(2, 10))
    print(my_mult(2, 10, deco1='BLAM'))

结果与预期一致:

代码语言:javascript
复制
Decorated(deco0, deco1)
7
Decorated(BLA, deco1)
7
Decorated(deco0, deco1)
20
Decorated(deco0, BLAM)
20

装饰器返回的inner函数签名与python2不兼容:

代码语言:javascript
复制
File "./deco.py", line 5
  def inner(arg0, *args, deco0='deco0', deco1='deco1', **kwargs):
                             ^
SyntaxError: invalid syntax

Python2中有没有一种设计模式可以方便装饰者添加关键字参数?或者更好的是,同时兼容Python2和Python3的模式?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-06 00:43:07

我认为你必须在内部函数中修改kwargs

代码语言:javascript
复制
def inner(arg0, *args, **kwargs):
    deco0 = kwargs.pop('deco0', 'deco0')
    deco1 = kwargs.pop('deco1', 'deco1')
    print("Decorated({}, {})".format(deco0, deco1))
    return f(arg0, *args, **kwargs)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52189910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档