呷/ Python的内部结构数组 [英] SWIG/python array inside structure
问题描述
我得看起来像内部header.h定义的结构:
I've got a structure defined inside header.h that looks like :
typedef struct {
....
int icntl[40];
double cntl[15];
int *irn, *jcn;
....
当我初始化一个对象,这个结构,我有机会到整数/双打,但不是数组。
When I init an object with this structure, I have access to integers/doubles but not arrays.
>> st.icntl
<Swig Object of type 'int *' at 0x103ce37e0>
>> st.icntl[0]
Traceback (most recent call last):
File "test_mumps.py", line 19, in <module>
print s.icntl[0]
TypeError: 'SwigPyObject' object is not subscriptable
如何访问该值读/写?
How to have access to the values in read/write?
推荐答案
要做到这一点,最简单的方法是包装在结构
,然后可以为您的阵列<一个href=\"http://stackoverflow.com/questions/216972/in-python-what-does-it-mean-if-an-object-is-subscriptable-or-not\">extra方法符合脚标要求。
The easiest way to do this is to wrap your arrays inside a struct
, which can then provide extra methods to meet the "subscriptable" requirements.
我已经把一个小例子。它假定你正在使用C ++,但相当于C版本是相当琐碎从这一构造,它只是需要一点点的重复。
I've put together a small example. It assumes you're using C++, but the equivalent C version is fairly trivial to construct from this, it just requires a bit of repetition.
先上去,我们用来包裹固定大小的数组的C ++头具有结构
我们要包装和模板:
First up, the C++ header that has the struct
we want to wrap and a template that we use for wrapping fixed size arrays:
template <typename Type, size_t N>
struct wrapped_array {
Type data[N];
};
typedef struct {
wrapped_array<int, 40> icntl;
wrapped_array<double, 15> cntl;
int *irn, *jcn;
} Test;
我们的相应痛饮接口,那么看起来像:
Our corresponding SWIG interface then looks something like:
%module test
%{
#include "test.h"
#include <exception>
%}
%include "test.h"
%include "std_except.i"
%extend wrapped_array {
inline size_t __len__() const { return N; }
inline const Type& __getitem__(size_t i) const throw(std::out_of_range) {
if (i >= N || i < 0)
throw std::out_of_range("out of bounds access");
return self->data[i];
}
inline void __setitem__(size_t i, const Type& v) throw(std::out_of_range) {
if (i >= N || i < 0)
throw std::out_of_range("out of bounds access");
self->data[i] = v;
}
}
%template (intArray40) wrapped_array<int, 40>;
%template (doubleArray15) wrapped_array<double, 15>;
诀窍还有我们已经使用%延长
提供<一个href=\"http://docs.python.org/reference/datamodel.html#object.__getitem__\"><$c$c>__getitem__$c$c>这就是Python使用的标读取和<一个href=\"http://docs.python.org/reference/datamodel.html#object.__setitem__\"><$c$c>__setitem__$c$c>为写。 (我们也可以提供一个 __ __ ITER
使类型可重复的)。我们也给了具体的 wraped_array
取值我们想用独特的名称,以使痛饮他们包裹在输出中。
The trick there is that we've used %extend
to supply __getitem__
which is what Python uses for subscript reads and __setitem__
for the writes. (We could also have supplied a __iter__
to make the type iteratable). We also gave the specific wraped_array
s we want to use unique names to make SWIG wrap them in the output.
通过附送的界面,我们现在可以做的:
With the supplied interface we can now do:
>>> import test
>>> foo = test.Test()
>>> foo.icntl[30] = -654321
>>> print foo.icntl[30]
-654321
>>> print foo.icntl[40]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "test.py", line 108, in __getitem__
def __getitem__(self, *args): return _test.intArray40___getitem__(self, *args)
IndexError: out of bounds access
您也可能会发现这种方法有用/有趣的选择。
You might also find this approach useful/interesting as an alternative.
这篇关于呷/ Python的内部结构数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!