gpt4 book ai didi

python - 从传递的函数中获取 *args 和 **kwargs

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

在下面的代码中,我如何在不需要包装函数的情况下获取函数 f 中的 *args 和 **kwargs?

def f(func):
def wrapper(*args, **kwargs):
print(args)
print(kwargs)
return func(*args,**kwargs)
return wrapper

@f
def write(text):
print(text)

# write = a(write)

write('dog')

失败的尝试 1:

def f(func):
a=func(*args)
k=func(**kwargs)

导致错误:

NameError: global name 'args' is not defined

失败的尝试 2:

def f(func(*args,**kwargs)):
a=func(*args)
k=func(**kwargs)

最佳答案

包装函数是必需的,它是 Python 中装饰器定义工作方式的标准部分。

但是,您可以使用 functools.wraps() 帮助掩盖回溯中包装函数的存在:

import functools

def f(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper

这将更新包装函数以具有包装函数的名称和文档字符串。

--

装饰器只不过是传递给函数的函数。这段代码...

def dec(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper

@dec
def myfunc(foo, bar):
return foo+bar

相当于这段代码:

def dec(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper

def myfunc(foo, bar):
return foo+bar

myfunc = dec(myfunc)

请注意传递给 dec 的东西是一个函数,它甚至还没有被调用——所以在 dec 被调用。这就是涉及包装函数的原因:它添加了一个层,在调用原始函数时可以捕获参数。

关于python - 从传递的函数中获取 *args 和 **kwargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23114866/

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