SWIG和C ++枚举类

支持

编辑答案解决了问题,但最后我提出了一个更具模块化的解决方案。看看这个 :)

两次 讨论我知道,出于类型安全的考虑enum class应该选择这些讨论enum因此,我在项目中使用了它,但是当用SWIG包装它们时,我得到了一些我不喜欢的东西。

给出简单的枚举

enum class type {
    A, B, C, D, E, F, G, H, I
};

.hpp文件中,例如my_types.hpp,然后my_types.i文件:

%module my_types
%{
#include "my_types.hpp"
%}
%include "my_types.hpp"

生成的python文件包含包含

type_A = _my_types.type_A
type_B = _my_types.type_B
type_C = _my_types.type_C
type_D = _my_types.type_D
type_E = _my_types.type_E
type_F = _my_types.type_F
type_G = _my_types.type_G
type_H = _my_types.type_H
type_I = _my_types.type_I

这意味着当在Python中使用它时,我将不得不做

import my_types as mt
mt.type_A

使用它们,.....嗯,在这种情况下还可以,因为单词的type长度不是那么长,但是对于较长的单词来说,它看起来就不那么好了,而且,对我来说,它也不会在每个枚举值的开头都具有枚举的名称非常有意义。

有什么方法可以重命名它们(也许使用%rename),这样使用它们就可以如此简单吗?

import my_types as mt
mt.A

我不知道如何%rename在这种情况下使用,或者甚至可以用于此目的。任何帮助,包括有关如何以不同方式进行相同操作的想法(可能无需枚举),将不胜感激。谢谢你们。

编辑:一些评论指出,将枚举名称放在每个枚举名称的前面确实很有意义。我想详细说明我对我说不的理由。如果我们考虑一个称为枚举的模块的情况,那么代码看起来有点多余。由于types已经是Python的模块,因此更好的示例是颜色:

enum class colours {
    Blue, Red
};

并按照建议使用包装后的代码,如下所示:

import colours
Blue = colours.colours_Blue
Red = colours.colours_Red

在我看来无需编写colours指向的引用BlueRed因为该模块colours仅包含一个“枚举”。取而代之会更好吗?

import colours
Blue = colours.Blue
Red = colours.Red

一个答案已经解释了如何实现这一目标。我会尽快查看。非常感谢!

编辑答案解决了问题。我想对其进行一些更改,并提出一个稍微更“模块化”的解决方案:

%pythoncode %{
__enum_name = "colours"            # your enumeration's name
__enum = __import__(__enum_name)   # import module
__scope_name = __enum_name + "_"   # scope's name (= "colours_")
__scope_length = len(__scope_name) # length
for name in dir(__enum):
    if name.find(__scope_name) == 0:
        setattr(__enum, name[__scope_length:], getattr(__enum, name))
        delattr(__enum, name) # optional
del name, __enum_name, __enum, __scope_name, __scope_length
%}

我认为这可以使您的项目更容易地复制和粘贴,因为您的枚举十分之一。再次根据答案。

维姆·拉夫里森(Wim Lavrijsen)

其次,我不完全理解为什么要删除作用域(尽管我猜是因为在python中已经获得了模块作用域,而C ++中却没有)。现在,%rename由于它不是文本转换,因此我认为无法使其起作用。但是,我可以想到两种选择,一种在C ++中重命名,另一种在Python中重命名。

用C ++重命名

更改my_types.hpp为:

enum class type {
    A, B, C, D, E, F, G, H, I
};

#ifdef SWIG
constexpr type A = type::A;
constexpr type B = type::B;
constexpr type C = type::C;
constexpr type D = type::D;
constexpr type E = type::E;
constexpr type F = type::F;
constexpr type G = type::G;
constexpr type H = type::H;
constexpr type I = type::I;
#endif

然后编译包装器并-DSWIG添加到命令行中。

在Python中重命名

修改my_types.i为:

%module my_types
%{
#include "my_types.hpp"
%}
%include "my_types.hpp"

%pythoncode %{
import my_types
for name in dir(my_types):
    if name.find('type_') == 0:
       setattr(my_types, name[5:], getattr(my_types, name))
       delattr(my_types, name) # optional
del name
%}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章