首页 > 解决方案 > 无法使用 **kwargs 传递对象

问题描述

我一直在尝试处理 *args 和 **kwargs 关键字。

我一直在玩下面的代码:

user1 = {
    'name': 'Gandalf',
    'wizard': True
}

def authenticated(func):
    def inner_func(*args, **kwargs):
        print(kwargs)
        if kwargs['wizard']:
            print('(:**********:)')
        return func(*args, **kwargs)    
    return inner_func
    
    
@authenticated
def message_friends(user):
    print(user)
    print(user.name)
    print('message has been sent')
    print(user.items()) # every key-value pair in a dictionary is a tuple
     
    for key, value in user.items(): 
        print(key, value)
        print (type((key, value)))
    print('**********')

message_friends(**user1)

我收到以下错误。但我不确定为什么。有人可以指出我正确的方向。

{'name': 'Gandalf', 'wizard': True}
(:**********:)
Traceback (most recent call last):
  File "main.py", line 31, in <module>
    message_friends(**user1) #closure is run
  File "main.py", line 12, in inner_func
    return func(*args, **kwargs)    
TypeError: message_friends() got an unexpected keyword argument 'name'

标签: python

解决方案


**user1 将字典解压缩为关键字参数,字典的键作为名称,值作为值。因此,对于字典的每个键,您的函数中都需要一个同名的参数。此代码有效:

user1 = {
    'name': 'Gandalf',
    'wizard': True
}

def authenticated(func):
    def inner_func(*args, **kwargs):
        print(kwargs)
        if kwargs['wizard']:
            print('(:**********:)')
        return func(*args, **kwargs)    
    return inner_func
    
    
@authenticated
def message_friends(name, wizard):
    print(name)
    print(wizard)
    print('message has been sent')
    print('**********')

message_friends(**user1)

如果你不想要硬编码的变量名,你可以在message_user函数中重新打包字典:

user1 = {
    'name': 'Gandalf',
    'wizard': True
}

def authenticated(func):
    def inner_func(*args, **kwargs):
        print(kwargs)
        if kwargs['wizard']:
            print('(:**********:)')
        return func(*args, **kwargs)    
    return inner_func


@authenticated
def message_friends(**user):
    print(user)
    print(user["name"])
    print('message has been sent')
    print(user.items()) # every key-value pair in a dictionary is a tuple

    for key, value in user.items(): 
        print(key, value)
        print(type(key), type(value))
    print('**********')

message_friends(**user1)

推荐阅读