- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有没有办法让 SWIG 包装的 C++ 对象在 C++ 和 Python 之间来回传递时携带自定义 Python 数据?示例:
example.h
class MyClass
{
public:
int foo;
};
// Black box functions.
// Only thing guaranteed is that the last object handed to consume
// will be returned by eject.
void consume(MyClass *obj);
MyClass *eject();
示例.i
%module Example
%{
#include "example.h"
%}
%include "example.h"
测试.py
import Example
a = Example.MyClass()
a.bar = "Puppies"
Example.consume(a)
b = Example.eject()
## Should output "Puppies"
print b.bar
当前输出是一个“AttributeError: bar”。
有没有办法获得这种功能?如果可以自定义 SWIG 的 _getattr_ MyClass 函数,那么可能可以从内部 PyObject* 存储和加载未知属性(通过自动让 SWIG 成为 MyClass 的子类,或者让这样的对象已经存在于 MyClass 中)?
谢谢!
最佳答案
这是迄今为止我提出的唯一(部分)解决方案:
class MyClass
{
...
MyClass() : data(NULL) {}
~MyClass() {if(data) Py_DECREF(data);}
PyObject *data;
};
%typemap(in) PyObject* data {
if(arg1 && arg1->data != NULL)
Py_DECREF(arg1->data);
$1 = $input;
Py_XINCREF($1);
}
%typemap(out) PyObject* data {
$result = $1;
}
问题:
1) SWIG 将 $1
设置为 NULL
,而不是现有值,我找不到官方方法来访问类型映射中的现有值。以上取决于 SWIG 将对象 (MyClass *) 命名为 arg1。有效,但可能无法跨 future 的 SWIG 版本移植。
2) Python代码必须是a.data.bar = "Puppies"
。这没问题,但并不完美。
3) 它要求类有一个data
成员。这对我当前的需求来说没问题,可以由基类处理。
4) 类的析构函数也必须知道数据,并清理它。同样,可以满足我当前的需求,但有些麻烦。
关于在 SWIG 中携带自定义 Python 数据的 C++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5546344/
数据: structure(list(id = c(1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5), ax = c("a", "a", "b
我目前正在离散数学课上做一个项目,我们必须编码: 1.) RippleCarryAdder:它是一个用于添加固定大小的 5 位整数的电路。参数: x_array: operand 1, i.e. an
所以我已经让这两个数组在不需要携带任何东西时正确添加。所以 a[0,1,1] + b[0,1,1] 会给我 c[0,0,2,2],但如果我类似地做 a[0,9,9] + b[0, 9,9] 我只得到
我正在尝试使用 getline 从 .csv 文件中获取数据,但它不会在换行符处停止。代码: while (file.good()) { getline(file, value, ',
下面是我的代码 from docutils.core import publish_string from docutils.writers.html4css1 import Writer as Hi
我是一名优秀的程序员,十分优秀!