** 之后的参数必须是一个映射,而不是 ChatPermissions
argument after ** must be a mapping, not ChatPermissions
当我打印对象时:
print(permissions)
它有这样的输出:
{'can_send_messages': True, 'can_send_media_messages': True, 'can_send_polls': True, 'can_send_other_messages': True, 'can_add_web_page_previews': True, 'can_change_info': True, 'can_invite_users': True, 'can_pin_messages': True}
就像一个映射对象
但是当我尝试将其作为参数时:
some_method(id, **permissions)
它给出错误:
argument after ** must be a mapping, not ChatPermissions
有什么问题,我该如何解决?
这不是最优雅的解决方案,但在这种情况下是可行的:
import ast
some_method(id, **ast.literal_eval(str(permissions)))
ChatPermissions
的 toString()
方法看起来像字典,即使它不是字典。因此,我们可以用它来创建一个字典,然后有一个映射对象。
假设 ChatPermissions
是 telegram
库中的 class,那么您可以这样做:
some_method(id, **permissions.to_dict())
一般来说,你也可以使用__dict__
来获取对象属性的字典:
some_method(id, **permissions.__dict__)
根据source code,to_dict
方法本身使用__dict__
,但排除了一些属性(bot
和以下划线开头的属性)。
当我打印对象时:
print(permissions)
它有这样的输出:
{'can_send_messages': True, 'can_send_media_messages': True, 'can_send_polls': True, 'can_send_other_messages': True, 'can_add_web_page_previews': True, 'can_change_info': True, 'can_invite_users': True, 'can_pin_messages': True}
就像一个映射对象 但是当我尝试将其作为参数时:
some_method(id, **permissions)
它给出错误:
argument after ** must be a mapping, not ChatPermissions
有什么问题,我该如何解决?
这不是最优雅的解决方案,但在这种情况下是可行的:
import ast
some_method(id, **ast.literal_eval(str(permissions)))
ChatPermissions
的 toString()
方法看起来像字典,即使它不是字典。因此,我们可以用它来创建一个字典,然后有一个映射对象。
假设 ChatPermissions
是 telegram
库中的 class,那么您可以这样做:
some_method(id, **permissions.to_dict())
一般来说,你也可以使用__dict__
来获取对象属性的字典:
some_method(id, **permissions.__dict__)
根据source code,to_dict
方法本身使用__dict__
,但排除了一些属性(bot
和以下划线开头的属性)。