在 pythoncode 块中使用模块定义的常量

Use module defined constants in pythoncode block

我的 C 代码定义了一个常量,我正在尝试添加使用该常量的 python 代码(在 pythoncode 块中),由于某些原因,这不起作用。

演示.i文件:

%module test
%{
// c code defines a static constant
static const int i=3;
%}

// declare the constant so that it shows up in the python module
static const int i;

%pythoncode %{
# try to use the constant in some python code
lookup={'i':i,}
%}

这是错误:

[dave]$ python -c "import test"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "test.py", line 70, in <module>
    lookup={'i':i,}
NameError: name 'i' is not defined

如果我在 pythoncode 块中注释掉 lookup 字典,一切正常:

[dave]$ python -c "import test; print test.i"
3

所以至少当我导入模块时常量出现了。

如何在我的 pythoncode 块中 "see" C 定义的常量?

痛饮 2.0.4,python2.7.

Adding additional Python code 表示 %pythoncode:

This code gets inserted in to the .py file created by SWIG.

所以让我们跟踪生成的 test.py:

# try to use the constant in some python code
lookup={'i':i,}

# This file is compatible with both classic and new-style classes.

cvar = _test.cvar
i = cvar.i

在定义 i 之前插入了 %pythoncode。由于这是第一次也是唯一一次出现,您可能需要直接使用 _test.cvar.i 来代替:

%pythoncode %{
# try to use the constant in some python code
lookup={'i': _test.cvar.i,}
%}

另一种解决方法是使用函数将引用变量推迟到模块完成加载之后:

%pythoncode %{
def lookup( key ){
     mp={'i':i}
     return mp[key]
%}