Decorators:TypeError:“为函数的关键字argument<variable name>”获取多个值

2024-09-30 00:37:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个decorator,它使用authToken并提供用用户标识装饰的函数,其目的是阻止每个特定于用户的函数都必须查找用户对象。在

我使用了*pargs和**kwargs使decorators成为泛型,并使用任何其他参数处理函数。在

但是,当我调用一个修饰函数时,不仅仅使用decorator设置的参数,我会得到错误: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

谢谢!在


Tags: 函数用户nameauth参数returndefdecorator
1条回答
网友
1楼 · 发布于 2024-09-30 00:37:14

在代码片段中,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

相关问题 更多 >

    热门问题