gpt4 book ai didi

python - “kwargs”在python装饰器中为空

转载 作者:行者123 更新时间:2023-12-01 14:45:17 25 4
gpt4 key购买 nike

我在下面运行了一个装饰器演示。

def logger(func):
def inner(*args, **kwargs):
print(args)
print(kwargs)
return func(*args, **kwargs)
return inner

@logger
def foo1(a, b, c, x=2, y=1):
print(x * y)

foo1(6,7,8)

输出是:
(6, 7, 8)
{}
2

为什么字典是空的?我觉得应该是 {'x':2, 'y':1}

最佳答案

那是因为没有 kwargs在函数调用中提供。和装饰logger对此一无所知,也不知道将使用什么功能。它是 kwargs 之间的“代理”在那里提供和真正的电话。
请参阅以下示例:

# kwargs are not provided (not redefined), function `foo1` will use default.
>>> foo1(6, 7, 8)
(6, 7, 8)
{}
2

# new kwargs are provided and passed to decorator too
>>> foo1(6, 7, 8, x=9, y=10)
(6, 7, 8)
{'x': 9, 'y': 10}
90
这类似于:
def foo1(a, b, c, x=2, y=1):
print(x * y)


def logger(func):
def inner(*args, **kwargs):
print(args)
print(kwargs)
return func(*args, **kwargs)
return inner


wrapped_foo1 = logger(foo1)
wrapped_foo1(6,7,8)
甚至可以简化为以下内容,当您可以清楚地看到问题时:
def foo1_decorated(*args, **kwargs):
print(args) # <-- here it has no chance to know that `x=2, y=1`
print(kwargs)
return foo1(*args, **kwargs)

foo1_decorated(6, 7, 8)

关于python - “kwargs”在python装饰器中为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52117822/

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