gpt4 book ai didi

python - Python 中经过验证的函数参数

转载 作者:太空宇宙 更新时间:2023-11-03 15:35:54 30 4
gpt4 key购买 nike

我有一个函数

def func(a,b,c,d):
...

我正在尝试编写一个装饰器来理解参数并将其中一些参数记录到不同的系统。

def decorator(func):
def new_func(*args, **kwargs):
if (func.__name__ == 'func'):
a = ?
b = ?
c = ?
d = ?
else:
a = ?
b = ?
c = ?
d = ?
log_to_system(a, b, c, d)
return func(*args, **kwargs)
return new_func

问题是装饰器没有一种简单的方法从 args 和 kwargs 中提取 a、b、c、d 值,因为用户可以使用位置参数或关键字参数传递这些值。我还想保留这个通用性,因为这个装饰器可以用于各种不同的功能。

是否有库或实用程序可以轻松地从 args 和 kwargs 中提取参数值?

最佳答案

一个简单的方法是让你的 log_to_system 函数除了它实际记录的已知参数之外还接受可变参数和可变关键字参数,这样你就可以简单地传递可变参数和变量从装饰函数到 log_to_system 的关键字参数,让解释器提取参数 abcd 给你:

def log_to_system(a, b, c, d, *args, **kwargs):
print(a, b, c, d)

def decorator(func):
def new_func(*args, **kwargs):
log_to_system(*args, **kwargs)
return func(*args, **kwargs)
return new_func

@decorator
def func(a, b, c, d, e):
pass

func(1, 2, c=3, d=4, e=5)

这个输出:

1 2 3 4

或者,您可以使用 inspect.signature 在将给定的变量参数和关键字参数绑定(bind)到装饰函数的签名后获取参数字典,以便您可以调用 log_to_system 只包含它需要的参数:

import inspect

def log_to_system(a, b, c, d):
print(a, b, c, d)

def decorator(func):
sig = inspect.signature(func)
def new_func(*args, **kwargs):
arguments = sig.bind(*args, **kwargs).arguments
log_to_system(**{k: arguments[k] for k in log_to_system.__code__.co_varnames})
return func(*args, **kwargs)
return new_func

@decorator
def func(a, b, c, d, e):
pass

func(1, 2, c=3, d=4, e=5)

这个输出:

1 2 3 4

关于python - Python 中经过验证的函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54833544/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com