boost.python字符串管理

时间:2016-08-03 11:23:33

标签: python boost boost-python

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

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

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

1 个答案:

答案 0 :(得分:2)

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

答案很长:

  

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

没有

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

  

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

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/bxslider/4.2.5/jquery.bxslider.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/bxslider/4.2.5/jquery.bxslider.css">


<button class='toggle'>Switch Sliders</button>

<div class='layer on 1st'>
  <ul class="bx1">
    <li>
      <img src="https://placehold.it/350x150/fff/000?text=1">
    </li>
    <li>
      <img src="https://placehold.it/350x150/fff/000?text=2">
    </li>
  </ul>
</div>





<div class='layer off 2nd'>
  <ul class="bx2">
    <li>
      <img src="https://placehold.it/350x150/000/fff?text=3">
    </li>
    <li>
      <img src="https://placehold.it/350x150/000/fff?text=4">
    </li>
  </ul>
</div>
  

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

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

您可以使用适当的呼叫策略扩展每个input = 'some value' sut = AWrapper() sut.name = input assert id(sut.name) == id(input) 呼叫,也可以覆盖def_readwrite到/ std::string的常规内置转换器,以引入此理论缓存。< / p>

请记住,python字符串是不可变的,std :: string是可变的。因此,当从C ++端更改成员时,您将遇到问题。此外,当代码处理每一个get和set操作时,这样的钩子在运行时也会降低性能。