" on function call-6ren"> " on function call-我有一个装饰器,它接受 authToken 并提供用 user_id 装饰的函数。这个想法是阻止每个特定于用户的功能不必查找他们的用户对象。 我已经使用 *pargs 和 **kwargs 来使装饰器-6ren">
gpt4 book ai didi

python - 装饰器 : TypeError: "got multiple values for keyword argument " on function call

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

我有一个装饰器,它接受 authToken 并提供用 user_id 装饰的函数。这个想法是阻止每个特定于用户的功能不必查找他们的用户对象。

我已经使用 *pargs 和 **kwargs 来使装饰器通用并使用带有任何其他参数的函数。

但是,当我调用装饰函数时,不仅仅是装饰器设置的参数,我得到错误:TypeError: changeUsername() got multiple values for keyword argument 'userId' .

有人知道为什么会这样吗?我在下面粘贴了一个最小的示例。

users = ["Name_1", "Name_2", "Name_3"]

def pwapi_auth(func):
def inner(authToken, *pargs, **kwargs):
users = {'a':0,
'b':1,
'c':2}
userId = users[authToken]
return func(userId = userId, *pargs, **kwargs)
return inner

@pwapi_auth
def getUsername(userId):
return users[userId]

@pwapi_auth
def changeUsername(userId, newName):
users[userId] = newName

print getUsername('b')
changeUsername('b', 'New_Person') # <-- Error occurs on this call

谢谢!

最佳答案

在您的代码片段中,python 混淆了 userId 的位置参数和关键字参数。在 pargs 中附加所有参数来解决这个问题-

def pwapi_auth(func):
def inner(authToken, *pargs, **kwargs):
# ...
users = {'a':0,
'b':1,
'c':2}
userId = users[authToken]
return func(*((userId,)+pargs), **kwargs)
return inner
>>> print getUsername('b')
Name_2
>>> changeUsername('b', 'New_Person')
>>> print getUsername('b')
New_Person

关于python - 装饰器 : TypeError: "got multiple values for keyword argument <variable name>" on function call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35383767/

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