使用Boost Python创建和访问frozenset
我有一些C++的方法,它们的参数或返回值是std::set<std::string>
,也就是一个字符串的集合。
我想把这个映射到Python中的frozenset
(或者普通的set
),但是似乎没有简单的方法可以做到这一点。
有没有人知道怎么能完成这个任务呢?
2 个回答
或者你可以用 std::map<YourType, int>
来代替 std::set<YourType>
,这里的值可以是0。例如,std::map
和 std::set
在插入和查找的速度上是差不多的,而且它也会保持键的顺序,只是会稍微多占一点内存。如果需要的话,你可以在Python中用一些包装类来隐藏这种差别。缺点是你需要稍微修改一下现有的C++代码。
很遗憾,Boost.Python的标准indexing_suite
不支持std::set
。不过,有一个版本叫做indexing_suite v2,它可以在所有的STL容器上使用。(http://mail.python.org/pipermail/cplusplus-sig/2009-July/014704.html)
这个版本可能没有包含在官方发布中,但你可以通过询问其他人找到它。(http://mail.python.org/pipermail/cplusplus-sig/2009-July/014691.html)
我发现这个版本比原来的indexing_suite
更难用,但它可能适合你的需求。
如果这个方法不行,你可以像处理其他类一样,手动包装std::set<std::string>
。这样就能把std::set<std::string>
引入到Python中,并且可以很容易地把它转成Python的set
。
不过,我觉得这两种方法都比实际需要的工作量要大。以下是我会怎么做:
首先,在C++中用一个具有相同签名的函数来包装原来的函数,但把返回的数据放到一个std::vector<std::string>
中,而不是std::set<std::string>
。然后暴露这个新函数,而不是原来的那个。
这样,你就可以在Python中获取到数据了。
其次,在Python中再写一个函数,把C++函数返回的std::vector<std::string>
中的数据放到一个Python的set
里。
是的,从设计美学的角度来看,这样做确实有点傻,而且代码的性能也不是最好的,但这样可以用最少的代码实现你的目标,而且相对来说比较稳健。