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

时间:2017-07-10 14:25:55

标签: python python-3.x dictionary google-cloud-pubsub argument-unpacking

我正在尝试在python中解压缩一些函数:

我有一个函数,packet作为参数(应该是dict)

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

我这样叫:

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

发布功能,位于3rd party api(Google Pub / Sub API),以及我从源头看到的内容:

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 dict参数解压缩为publish()接受的内容?

谢谢!

编辑:

我收到的一些错误消息。

有:

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

我得到:TypeError: 1 has type <class 'int'>, but expected one of: (<class 'bytes'>, <class 'str'>)

有:

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

我得到:publish() takes from 2 to 3 positional arguments but 4 were given

有:

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

我得到:TypeError: queue() takes 1 positional argument but 2 were given

和for:

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

我得到:TypeError: publish() takes from 2 to 3 positional arguments but 4 were given

编辑2:

正如@gall建议的那样,这是我发送的数据,解包没有问题。有了这个功能:

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

当我只用字符串调用它时它可以工作:

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

谢谢大家!

1 个答案:

答案 0 :(得分:1)

根据publish的文档字符串,attr必须是string -> string字典。

您可以通过替换

来解决问题
queue({
    'an_item': 1,
    'a_key': 'value'
})

使用纯字符串参数,例如

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

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