gpt4 book ai didi

python - SWIG/python 数组内部结构

转载 作者:太空狗 更新时间:2023-10-29 22:23:36 26 4
gpt4 key购买 nike

我在 header.h 中定义了一个结构,如下所示:

typedef struct {
....
int icntl[40];
double cntl[15];
int *irn, *jcn;
....

当我用这种结构初始化一个对象时,我可以访问整数/ double 但不能访问数组。

>> 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

如何访问读/写中的值?

最佳答案

最简单的方法是将数组包装在一个struct 中,然后它可以提供extra methods to meet the "subscriptable" requirements。 .

我举了一个小例子。它假定您使用的是 C++,但等效的 C 版本从中构造起来相当简单,只需要稍微重复一下即可。

首先,C++ 头文件包含我们要包装的 struct 和我们用于包装固定大小数组的模板:

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;

我们相应的 SWIG 界面看起来像这样:

%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>;

这里的技巧是我们使用 %extend 来提供 __getitem__这是 Python 用于下标读取和 __setitem__ 的内容对于写入。 (我们也可以提供一个 __iter__ 来使类型可迭代)。我们还提供了特定的 wraped_array,我们希望使用唯一的名称让 SWIG 将它们包装在输出中。

使用提供的接口(interface),我们现在可以:

>>> 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

您可能还会找到 this approach有用/有趣的替代方案。

关于python - SWIG/python 数组内部结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8114030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com