python - 无法使用 **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'
解决方案
**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)
推荐阅读
- python - 这个语句在 Python 中有效吗?
- javascript - React Context API - Global Context Provider,这是否适用于全局上下文提供程序以避免嵌套?
- c# - 在属性中设置一个值 - Setter 从未到达
- sql - 如果当前表中不存在值,则在另一个表中搜索一个值
- php - 未找到 Laravel DomPDF 视图
- macos - Flutter 应用程序数据在 macOS 上的位置
- list - 使用 Lambda 反转或排序列表
- android - 当 apk 来自 Firebase App Distribution 时,Google 登录(OAuth)不起作用
- reactjs - TypeError:无法读取空 React Apollo 测试的属性“createEvent”
- html - Websocket 打开 example.com/? 什么时候应该保留在 example.com 上(使用 socket.io)