首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确获取装饰器的默认关键字参数?

如何正确获取装饰器的默认关键字参数?
EN

Stack Overflow用户
提问于 2019-04-09 12:07:54
回答 1查看 282关注 0票数 1

我正在对一些函数应用装饰器,并且装饰器需要在函数中使用一些参数。然而,我会为参数分配一些默认值。装饰器通过*args, **kwargs接收参数。

代码语言:javascript
复制
def decorator(fn):
    def wrapper(*args, **kwargs):
        print(args)
        print(kwargs)
        # do something with the required1 and required2 ...
        return fn(*args, **kwargs)
    return wrapper

class MyClass(object):
    def foo(self, a, b, required1=0, required2='x'):
        pass

但是以不同的方式调用函数,装饰器包装器会收到不同的参数

代码语言:javascript
复制
A = MyClass()
A.foo(1, 2, 3, '4') # 1
A.foo(1, 2) # 2
A.foo(1, 2, required1=3, required2='4') # 3

输出将如下所示:

代码语言:javascript
复制
#1 
args: [<object at 0x0000>, 1, 2, 3, ‘4’]
kwargs: {}
#2
args: [<object at 0x0000>, 1, 2]
kwargs: {}
#3
args: [<object at 0x0000>, 1, 2]
kwargs: {‘required1’: 3, ‘required2’: ‘4’}

无论调用函数的方式如何,如果我想要访问所需的参数,比如r = kawrgs[‘required1’],我应该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-09 12:54:57

我曾试图在我的一个项目中解决这个问题。我发现的唯一方法就是使用python的内省。

代码如下:

代码语言:javascript
复制
bound_args = inspect.signature(fn).bind(*in_args, **in_kwargs)
bound_args.apply_defaults()
target_args = dict(bound_args.arguments)

它将函数的传入参数(无论是否带有关键字)绑定到已定义的函数名称

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55584997

复制
相关文章

相似问题

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