【问题标题】:boost.python string managementboost.python 字符串管理
【发布时间】:2016-08-03 11:23:33
【问题描述】:

boost.python 如何处理 std::string 成员变量? 具体来说,如果我有一个类及其 boost.python 包装器

class A {
public: 
    std::string name;
};
class_<A>("AWrapper")
.def_readwrite("name", &A::name);

std::string对象和它(string)表示的PyObject之间的对应关系是如何处理的: 是 boost::python::object(i.e. PyObject) 创建的,它存储指向字符串的指针,因此这个对象作为代理服务器? 因此,每次我想检索字符串成员的值时,都会创建 PyString 对象吗? 实习机制可以应用于这样的字符串对象吗?

【问题讨论】:

    标签: python boost boost-python


    【解决方案1】:

    简短的回答:您对行为的怀疑和见解大多是正确的,boost-python 将解释您的配置以产生简单且低效的行为,但是它提供了支持机制来覆盖和扩展它。这可能需要大量工作。

    长答案:

    是 boost::python::object(i.e. PyObject) 创建的,它存储指向字符串的指针,因此这个对象作为代理服务器?

    没有。

    Python 字符串是不可变的,默认情况下(使用您的配置)boost-python 会将 std::string 转换为新的 Python 字符串 (str)。所以没有进行代理。

    因此,每次我想检索字符串成员的值时,都会创建 PyString 对象?

    是的。以下断言将失败,我尝试验证对字符串的 python 引用是否具有相同的 python 对象 id。

    input = 'some value'
    sut = AWrapper()
    sut.name = input
    assert id(sut.name) == id(input)
    

    实习机制可以应用于此类字符串对象吗?

    例如,如果您可以为给定的 c++ 字符串启用创建的 python 字符串对象的缓存,然后在可用时返回以前创建的 python 字符串对象?答案也是肯定的,有可能。 boost-python 的概念是call policiescustom converters。 (两者都不是 boost-python 教程的一部分。)

    您可以使用适当的调用策略扩展每个def_readwrite 调用,或者覆盖std::string 到/从PyString 的通用内置转换器,以引入这个理论上的缓存。

    请记住,python 字符串是不可变的,而 std::string 是可变的。因此,当从 C++ 端更改成员时,您会遇到问题。此外,当代码处理每个单独的获取和设置操作时,此类挂钩也会在运行时降低性能。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 2011-10-01
      • 2020-10-21
      • 2016-01-09
      • 2010-10-11
      • 2011-10-22
      • 2017-07-17
      • 1970-01-01
      相关资源
      最近更新 更多