python - 如何正确获取装饰器的默认关键字参数?
问题描述
我正在将装饰器应用于某些函数,而装饰器将需要函数中的一些参数。然而,我会为参数分配一些默认值。装饰器使用 接收参数*args, **kwargs
。
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
但是以不同的方式调用函数,装饰器包装器将接收不同的参数
A = MyClass()
A.foo(1, 2, 3, '4') # 1
A.foo(1, 2) # 2
A.foo(1, 2, required1=3, required2='4') # 3
输出将是这样的:
#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’]
无论调用函数的方式如何,我应该怎么做?
解决方案
我试图在我的一个项目中解决这个问题。我发现的唯一方法是使用 python 的自省。
这是代码:
bound_args = inspect.signature(fn).bind(*in_args, **in_kwargs)
bound_args.apply_defaults()
target_args = dict(bound_args.arguments)
将函数的收入参数(无论是否带有关键字)绑定到函数的定义名称
推荐阅读
- r - ggplot2:在多面箱线图中绘制连接每组观察值的线
- python - API 端点问题,获取 Socket.gaierror: [Errno 11001] get addrinfo failed
- node.js - 我在尝试使用节点 js 在 AWS Cognito 中以管理员身份创建用户时遇到权限问题
- node.js - 如何在 Strapi 中加载关系的子组件
- html - CSS在祖父母的兄弟姐妹后面制作元素
- selenium-webdriver - 当id每次都改变时如何制作动态xpath
- phpmyadmin - PHPMyAdmin 需要密码
- java - 使用 Spring 处理子域
- javascript - Web3 - 从接口合同访问事件 - 此合同中不存在事件
- reactjs - 初始化和更改 Formik React-Select 值的问题