使用 Boost Python 创建和访问frozenset
Posted
技术标签:
【中文标题】使用 Boost Python 创建和访问frozenset【英文标题】:Create and access frozenset with Boost Python 【发布时间】:2011-02-09 15:21:49 【问题描述】:我有一些以std::set<std::string>
作为参数或返回值的 C++ 方法。
我想将此映射到 Python frozenset
(或常规 set
),但似乎没有一种直接的方法可以做到这一点。
有谁知道如何完成这项任务。
【问题讨论】:
【参考方案1】:或者您可以使用std::map<YourType, int>
代替std::set<YourType>
,例如,该值可以是0。std::map 与std::set 具有相同的插入/搜索时间复杂度,它还保持键的顺序,它只会使内存膨胀一点。然后你可以使用地图索引套件,如果需要的话,你可以在 python 中隐藏一些包装类中的差异。缺点是您必须稍微修改现有的 c++ 代码。
【讨论】:
【参考方案2】:不幸的是,来自 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中的数据。
其次,将 c++ 函数包装在 python 函数中,该函数将 std::vector<std::string>
中的数据填充到 python set
中。
是的,从设计美学的角度来看,这是相当愚蠢的,而且不是世界上性能最高的代码,但它可以让你用最少的代码到达你要去的地方,而且它相当健壮。
【讨论】:
第二个选项是我目前所做的,但它不是很干净整洁......我可以试试索引套件版本 2。以上是关于使用 Boost Python 创建和访问frozenset的主要内容,如果未能解决你的问题,请参考以下文章
Boost::python 和 Eigen/dense 创建分段错误
使用 boost::python::make_function 设置 __name__ 属性