如何将两个Python字典传递给C++函数以map接收

2 投票
2 回答
3817 浏览
提问于 2025-04-16 19:52

我想在Python中调用一个C++的函数,这个函数需要两个Python字典作为参数,这两个字典的键对应的值是列表,像这样:

a = {'str1': [1, 2, 3], 'str2': [4, 5, 6]}
b = {'str3': [7, 8, 9], 'str4': [10, 11, 12]}
cppFunction(a, b)

在C++中,这个函数会把这两个字典存储到两个类型为 map<string, vector<int>> 的变量里。我该怎么做呢?我需要使用boost库吗?

谢谢,

Qingkun

2 个回答

1

如果你想把Python的参数传给C/C++的函数,而这些参数在C/C++中没有直接对应的类型(比如不是字符串或数字),那么最好的办法就是把它们当作通用的Python对象来处理,获取它们的指针。

这就意味着你的C++扩展代码需要像Python解释器那样以通用的方式来处理这些对象。这包括查找它们的方法,并调用这些方法来操作它们的内容,比如获取、设置或删除它们的内容,特别是当它们是容器对象时,比如lists(列表)、dicts(字典)等。然后,你的扩展可以利用这些信息来构建你想要的具体C++ map<>模板类型。

开源项目PyCXX提供了一些工具,可以让你更容易地编写C++的Python扩展,同时也提供了处理DictList参数的现成C++类。更棒的是,你可以把它们当作抽象的Sequence(序列)和Mapping(映射)对象,这样你的扩展代码就能处理其他实现了相同接口的Python类型。

3

我理解你的问题有两个部分:1. 如何从Python调用C++函数?2. 在C++中应该使用什么数据结构来存储计算的输入?

关于第一个问题,答案比较复杂。你可以看看,比如说,这个问题这个问题。至于第二个问题,针对给出的例子,我建议可以使用map<string, vector<int>>,就像你提到的那样,放在一个包装类里,或者使用multimap<string, int>,这样用起来会更快,因为它现有的接口可能会更方便。

更新:我添加了一个关于第一个问题的其他答案链接。

撰写回答