SWIG:访问 Python 中的结构数组
SWIG: Access Array of Structs in Python
假设我有以下 static constexpr
c 结构数组:
#include <cstdint>
namespace ns1::ns2 {
struct Person {
char name[32];
uint8_t age;
};
static constexpr Person PERSONS[] = {
{"Ken", 8},
{"Cat", 27}
};
}
如何使用 swig 在 python 中访问 ns1::ns2::PERSONS
中的元素?
我能想到的一种方法是在 swig 接口文件中创建一个类似 const Person& get(uint32_t index)
的访问器。不过,我想知道是否有更优雅的方法,我不必为每个 c 结构数组创建访问器函数。
谢谢!
One way I can think of is to create a accessor like const Person& get(uint32_t index) in the swig interface file.
根据5.4.5 Arrays in the SWIG documentation,这是这样做的方法:
%module test
%include <stdint.i>
%inline %{
#include <cstdint>
namespace ns1::ns2 {
struct Person {
char name[32];
uint8_t age;
};
static constexpr Person PERSONS[] = {
{"Ken", 8},
{"Cat", 27}
};
}
// helper function
const ns1::ns2::Person* Person_get(size_t index) {
if(index < sizeof(ns1::ns2::PERSONS) / sizeof(ns1::ns2::Person)) // protection
return ns1::ns2::PERSONS + index;
else
return nullptr;
}
%}
演示:
>>> import test
>>> test.PERSONS.name # can only access the first element
'Ken'
>>> test.Person_get(1).name
'Cat'
>>> test.Person_get(2).name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'name'
SWIG 还可以使用 11.2.2 carrays.i 为您生成数组包装器,但没有边界检查:
%module test
%include <stdint.i>
%inline %{
#include <cstdint>
namespace ns1::ns2 {
struct Person {
char name[32];
uint8_t age;
};
static constexpr Person PERSONS[] = {
{"Ken", 8},
{"Cat", 27}
};
}
%}
%include <carrays.i>
%array_functions(ns1::ns2::Person,arrayPerson);
演示:
>>> import test
>>> test.arrayPerson_getitem(test.PERSONS,1).name
'Cat'
假设我有以下 static constexpr
c 结构数组:
#include <cstdint>
namespace ns1::ns2 {
struct Person {
char name[32];
uint8_t age;
};
static constexpr Person PERSONS[] = {
{"Ken", 8},
{"Cat", 27}
};
}
如何使用 swig 在 python 中访问 ns1::ns2::PERSONS
中的元素?
我能想到的一种方法是在 swig 接口文件中创建一个类似 const Person& get(uint32_t index)
的访问器。不过,我想知道是否有更优雅的方法,我不必为每个 c 结构数组创建访问器函数。
谢谢!
One way I can think of is to create a accessor like const Person& get(uint32_t index) in the swig interface file.
根据5.4.5 Arrays in the SWIG documentation,这是这样做的方法:
%module test
%include <stdint.i>
%inline %{
#include <cstdint>
namespace ns1::ns2 {
struct Person {
char name[32];
uint8_t age;
};
static constexpr Person PERSONS[] = {
{"Ken", 8},
{"Cat", 27}
};
}
// helper function
const ns1::ns2::Person* Person_get(size_t index) {
if(index < sizeof(ns1::ns2::PERSONS) / sizeof(ns1::ns2::Person)) // protection
return ns1::ns2::PERSONS + index;
else
return nullptr;
}
%}
演示:
>>> import test
>>> test.PERSONS.name # can only access the first element
'Ken'
>>> test.Person_get(1).name
'Cat'
>>> test.Person_get(2).name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'name'
SWIG 还可以使用 11.2.2 carrays.i 为您生成数组包装器,但没有边界检查:
%module test
%include <stdint.i>
%inline %{
#include <cstdint>
namespace ns1::ns2 {
struct Person {
char name[32];
uint8_t age;
};
static constexpr Person PERSONS[] = {
{"Ken", 8},
{"Cat", 27}
};
}
%}
%include <carrays.i>
%array_functions(ns1::ns2::Person,arrayPerson);
演示:
>>> import test
>>> test.arrayPerson_getitem(test.PERSONS,1).name
'Cat'