使用Boost Python创建和访问frozenset

5 投票
2 回答
876 浏览
提问于 2025-04-16 11:31

我有一些C++的方法,它们的参数或返回值是std::set<std::string>,也就是一个字符串的集合。 我想把这个映射到Python中的frozenset(或者普通的set),但是似乎没有简单的方法可以做到这一点。 有没有人知道怎么能完成这个任务呢?

2 个回答

1

或者你可以用 std::map<YourType, int> 来代替 std::set<YourType>,这里的值可以是0。例如,std::mapstd::set 在插入和查找的速度上是差不多的,而且它也会保持键的顺序,只是会稍微多占一点内存。如果需要的话,你可以在Python中用一些包装类来隐藏这种差别。缺点是你需要稍微修改一下现有的C++代码。

0

很遗憾,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里。

是的,从设计美学的角度来看,这样做确实有点傻,而且代码的性能也不是最好的,但这样可以用最少的代码实现你的目标,而且相对来说比较稳健。

撰写回答