首页 / PYTHON / C列表到Python列表
C列表到Python列表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C列表到Python列表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2704字,纯文字阅读大概需要4分钟。
内容图文
![C列表到Python列表](/upload/InfoBanner/zyjiaocheng/786/e66f225bd59f40409469f06543eb0869.jpg)
我正在为现有的C库编写一个包装器,它利用了列表,其中T是一个自定义结构.我被建议使用vector而不是list,但我试图避免修改库.
为了更好地理解场景,我做了一个简单的应用程序,使用列表作为注册to-python转换的代理(可以只读).
我当前的实现编译很好,python导入很好,可以创建对象,但是当我调用数据成员时,它会出错.
python shell输出:
In [1]: import my_list
In [2]: x = my_list.Bob()
In [3]: x.foos
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-2f015d13a87d> in <module>()
----> 1 x.foos
TypeError: No Python class registered for C++ class std::list<int, std::allocator<int> >
C档案:
#include <list>
#include <boost/python.hpp>
#include <boost/foreach.hpp>
#ifndef FOREACH
#define FOREACH BOOST_FOREACH
#endif
using namespace std;
using namespace boost::python;
template<typename T>
struct list_to_list
{
static PyObject* convert(const std::list<T>& src)
{
boost::python::list result;
FOREACH (const T& val, src)
{
result.append(val);
}
return incref(result.ptr());
}
};
struct Bob
{
std::list<int> foos;
};
BOOST_PYTHON_MODULE(my_list)
{
using namespace boost::python;
to_python_converter<std::list<int>, list_to_list<int> >();
class_<Bob>("Bob")
.def_readonly("foos", &Bob::foos)
;
}
我错过了什么吗?
解决方法:
如FAQ中所述,通过def_readonly(),def_readwrite()和add_property()以及默认策略公开的属性将不使用自定义转换器.要解决此问题,请使用add_property()替换def_readonly()和def_readwrite(),提供类型为boost::python::return_by_value的boost::python::return_value_policy.
在原始代码中,它将是:
BOOST_PYTHON_MODULE(my_list)
{
using namespace boost::python;
to_python_converter<std::list<int>, list_to_list<int> >();
class_<Bob>("Bob")
.add_property("foos", make_getter(&Bob_foos,
return_value_policy<return_by_value>()))
;
}
这是一个完整的例子:
#include <list>
#include <boost/assign/list_of.hpp>
#include <boost/foreach.hpp>
#include <boost/python.hpp>
namespace python = boost::python;
/// @brief Type to convert from an iterable to a Python list.
template <typename T>
struct list_to_list
{
static PyObject* convert(const std::list<T>& container)
{
python::list result;
BOOST_FOREACH(const T& value, container)
result.append(value);
return python::incref(result.ptr());
}
};
/// @brief mockup type.
struct Spam
{
Spam()
{
foos = boost::assign::list_of(1)(2)(3)(5);
}
std::list<int> foos;
};
BOOST_PYTHON_MODULE(example)
{
// Enable std::list<int> to Python list conversion.
python::to_python_converter<std::list<int>, list_to_list<int> >();
python::class_<Spam>("Spam")
.add_property("foo", python::make_getter(&Spam::foos,
python::return_value_policy<python::return_by_value>()))
;
}
由此产生的用法:
>>> import example
>>> spam = example.Spam()
>>> spam.foo
[1, 2, 3, 5]
内容总结
以上是互联网集市为您收集整理的C列表到Python列表全部内容,希望文章能够帮你解决C列表到Python列表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。