在SWIG>2.0.1中,相同的枚举项包装在不同类型的常量中

2024-06-01 14:41:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我在swig3.0.12中发现了一个小错误。如果在文件examples/python/enum/example.h中稍作更改,只需在enum item(g)中添加一个char常量:

enum color { RED, BLUE, GREEN = 'g'};

然后做一个包装,编译_示例.so运行$python runme.py,您将得到:

enter code here

*** color ***
RED    = 0
BLUE   = 1
GREEN  = g

*** Foo::speed ***
Foo_IMPULSE   = 0
Foo_WARP      = 1
Foo_LUDICROUS = 2

Testing use of enums with functions

color = RED, speed = IMPULSE speed
color = BLUE, speed = WARP speed
Traceback (most recent call last):
  File "runme.py", line 22, in <module>
    example.enum_test(example.GREEN, example.Foo.LUDICROUS)
TypeError: in method 'enum_test', argument 1 of type 'color'

情况很奇怪,不是吗?相同的枚举项包装在不同类型的常量中,可怜的小函数只等待一种类型的枚举常量(现在它等待int,但绿色常量类型是char)。如果没有回滚SWIG版本,如何绕过它,您怎么看?你知道吗

这个bug出现在swig3.0.12、3.0.11中,但在2.0.1中一切正常。你知道吗


Tags: py类型fooexamplegreenenumbluered
1条回答
网友
1楼 · 发布于 2024-06-01 14:41:27

好吧,这是一个老的SWIG bug,它出现在6年前,当时SWIG开发人员添加了不同类型的Enums特性。也许他们忘记了动态类型语言,比如PHP和Python,我不知道,但对我来说,这个问题是通过编译我自己的SWIG构建并修改解析器源代码来解决的。。。你知道吗

只需在Source/CParse/parser.y后面添加if条件:

5620 5620 Swig_error(cparse_file,cparse_line,"Type error. Expecting an integral type\n"); 
5621 5621 } 
5622 -    if ($$.type == T_CHAR) $$.type = T_INT; 
5623 5622 } 
5624 5623 ;

然后用这个小改动构建自己的SWIG,您将得到将所有枚举项包装为整数常量的结果。你知道吗

相关问题 更多 >