呷/ Python的内部结构数组 [英] SWIG/python array inside structure

查看:124
本文介绍了呷/ Python的内部结构数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我得看起来像内部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__这就是Python使用的标读取和<一个href=\"http://docs.python.org/reference/datamodel.html#object.__setitem__\"><$c$c>__setitem__为写。 (我们也可以提供一个 __ __ 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_arrays 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆