gpt4 book ai didi

python - 如何使用静态变量、自定义 getter 和 setter 扩展 SWIG 中的结构?

转载 作者:行者123 更新时间:2023-12-04 17:53:07 24 4
gpt4 key购买 nike

我想包装一个结构的静态成员变量,以便在从 Python 读取或写入时,在 C++ 端调用自定义 get/set 函数。对于非静态变量,以下工作。这是foo.h:

#ifndef FOO_H
#define FOO_H

#include <iostream>

struct Foo
{
static int bar() { std::cout << "Foo::bar()\n"; return 0; }
};

#endif

foo.i 看起来如下:

%module foo
%{
#include "foo.h"
%}

struct Foo
{
};

%extend Foo {
int i;
}

%{
int Foo_i_get(Foo* obj) {
return Foo::bar();
}
void Foo_i_set(Foo* obj, int i) {}
%}

这种工作,在 Python 中我可以做到:

import foo
f = foo.Foo()
f.i

这会触发 Foo::bar() 被调用。我想要实现的是具有相同行为的以下内容:

import foo
foo.Foo.i

这不起作用,因为 i 不是类属性。我天真地尝试更改 .i 文件中的以下内容:

%extend Foo {
static int i;
}

这会在 SWIG 生成的以下包装器代码中产生编译错误:

SWIGINTERN PyObject *Swig_var_Foo_i_get(void) {
PyObject *pyobj = 0;

pyobj = SWIG_From_int((int)(Foo::i));
return pyobj;
}

这是g++给出的错误信息:

foo_wrap.c: In function ‘PyObject* Swig_var_Foo_i_get()’:
foo_wrap.c:3208:31: error: ‘i’ is not a member of ‘Foo’
pyobj = SWIG_From_int((int)(Foo::i));

显然这不是正确的方法。如何使用自定义 setter 和 getter 扩展具有静态变量的结构?

最佳答案

这可能有效:foo.i 如下所示:

%module foo
%{
#include "foo.h"
%}

%include "foo.h"

%extend Foo {
int get_i(){ return Foo::bar(); }
%pythoncode %{
i = property(get_i)
%}
}

关于python - 如何使用静态变量、自定义 getter 和 setter 扩展 SWIG 中的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42784065/

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