如何检查boost-python包装的C ++对象的身份?

时间:2019-06-11 20:07:11

标签: boost-python

我正在使用boost :: python来包装C ++函数,该函数返回指向也被bp包装的现有C ++对象的指针。从Python调用该函数时,即使它们都引用相同的C ++实例,它每次也会返回一个新的Python对象。

是否有某种方法可以检查两个boost.python实例是否保持在同一个C ++对象上?

对于特定的C ++类C,可以通过对两个python对象使用extract<C*>(pyobj)来比较它们的C ++指针来完成。但是,这仅适用于C类型,并且需要为每个受支持的C ++类分别定义。

boost.python类似乎都继承自Boost.Python.instance。最好有一个is_identical函数,可以检查任何一对Boost.Python对象的身份。

这是最小的boost :: python代码,它定义一个geta()函数,该函数始终返回相同的C ++实例。

// cppidentity.cpp

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python/class.hpp>
#include <boost/python/reference_existing_object.hpp>

using namespace boost::python;

struct A { int a; };
A a_instance;

A* geta() { return &a_instance; }

BOOST_PYTHON_MODULE(cppidentity)
{
    class_<A>("A")
        .def_readwrite("a", &A::a);
    def("geta", &geta,
            return_value_policy<reference_existing_object>());
}

然后geta()的结果包含相同的C ++对象,但在Python中看起来却不同:

from cppidentity import geta
a0 = geta()
a1 = geta()
print(f"(a0.a, a1.a) = {(a0.a, a1.a)}")
print("setting a0.a = 13 ..."); a0.a = 13
print(f"(a0.a, a1.a) = {(a0.a, a1.a)}")
print(f"(a0 is a1) = {a0 is a1}    (a0 == a1) = {a0 == a1}")

输出

(a0.a, a1.a) = (0, 0)
setting a0.a = 13 ...
(a0.a, a1.a) = (13, 13)
(a0 is a1) = False    (a0 == a1) = False

0 个答案:

没有答案