将一个字典解包并作为关键字参数传递给函数

6

我正在尝试使用Python将一些字典解包到某些函数中:

我有一个接受packet作为参数的函数(应该是字典)

def queue(self, packet):
    self.topic.publish(self.message, self.client, **packet)

我称之为这样:

queue({
        'an_item': 1,
        'a_key': 'value'
    })

发布功能是在第三方API(Google Pub/Sub API)的topic.py中实现的,从我查看的源代码来看:

def publish(self, message, client=None, **attrs):
    ...
    message_data = {'data': message, 'attributes': attrs}
    message_ids = api.topic_publish(self.full_name, [message_data])

它接受**attrs以便将所有关键字参数传递到另一个函数。

目前,我的queue()函数不起作用。

如果可能的话,我该如何修复我的queue()函数,以便将packet字典参数解包成publish()可以接受的内容?

谢谢!


编辑:

一些错误消息:

for:

def queue(self, packet):
    self.topic.publish(self.message, self.client, **packet)

我得到了以下错误:TypeError: 1 的类型为 <class 'int'>,但期望的是其中之一:(<class 'bytes'>, <class 'str'>)


对于:

def queue(self, packet):
    self.topic.publish(self.message, self.client, packet)

我收到的错误信息是:publish()需要2到3个定位参数,但是给出了4个


针对:

def queue(self, **packet):
    self.topic.publish(self.message, self.client, packet)

我理解到的内容是:

我收到了一个错误信息:TypeError: queue()接受1个位置参数,但实际给定了2个


还有:

def queue(self, *packet):
    self.topic.publish(self.message, self.client, packet)

我得到了一个错误信息:TypeError: publish()需要2到3个位置参数,但给出了4个
编辑2:
正如@gall正确建议的那样,问题在于我发送的数据,而解包没有问题。使用以下函数:
def queue(self, packet):
    self.topic.publish(self.message, self.client, **packet)

只使用字符串时,它可以正常工作:

queue({
        'an_item': '1',
        'a_key': 'value'
    })

谢谢大家!

1
你的函数为什么不能运行?能否提供一个错误信息? - Jonas Adler
1
是的 @JonasAdler。谢谢。我会添加错误消息示例,以说明我到目前为止尝试过的内容。 - ET-CS
1
self.topic 是指什么?是 Topic 类的一个实例还是仅指类本身? - danidee
1
@danidee 在谷歌的Sub/Pub API中有一些对象,让你可以访问发布(publish())函数来发布/订阅(pub/sub)频道。 - ET-CS
3
publish的文档字符串中,它说:type attrs: dict (string -> string), 但是你在示例中似乎有一个值是int。这可能是问题所在吗?除此之外,你调用的方式似乎没问题。 - Gall
@Gall。是的!尝试发送{ 'an_item': '1', 'a_key': 'value' }是可以的。这是否意味着我不能将int作为参数传递?嗯..所以我猜拆包实际上起作用了 :) - ET-CS
1个回答

1
根据publish的文档字符串,attr必须是一个string -> string字典。您可以通过替换来解决此问题。
queue({
    'an_item': 1,
    'a_key': 'value'
})

使用纯字符串参数,例如:
queue({
    'an_item': '1',
    'a_key': 'value'
})

似乎你的问题与字典解包无关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接