简体   繁体   English

如何在 python 中使用枚举?

[英]how to use enum in swig with python?

I have a enum declaration as follows:我有一个枚举声明如下:

typedef enum mail_ {
    Out = 0,
    Int = 1,
    Spam = 2
} mail;

Function:功能:

mail status;
int fill_mail_data(int i, &status);

In the function above, status gets filled up and will send.在上面的函数中, status被填满并发送。

When I am trying this through swig I am facing the following issues:当我通过 swig 尝试这个时,我面临以下问题:

  1. It is not showing details of mail .它没有显示mail详细信息。 When I try to print mail.__doc__ or help(mail) , it is throwing an error saying there is no such Attribute, though though i am able to use those values ( Spam , In , and Out ).当我尝试打印mail.__doc__help(mail) ,它会抛出一个错误,指出没有这样的属性,尽管我可以使用这些值( SpamInOut )。
  2. As shown above, the Swig does not know what main is, so it is not accepting any function arguments for that mail .如上所示,Swig 不知道main是什么,因此它不接受该mail任何函数参数。

To SWIG, an enum is just an integer.对于 SWIG, enum只是一个整数。 To use it as an output parameter as in your example, you also can declare the parameter as an output parameter like so:要将其用作示例中的输出参数,您还可以将参数声明为输出参数,如下所示:

%module x

// Declare "mail* status" as an output parameter.
// It will be returned along with the return value of a function
// as a tuple if necessary, and will not be required as a function
// parameter.
%include <typemaps.i>
%apply int *OUTPUT {mail* status};

%inline %{

typedef enum mail_ {
    Out  = 0,
    Int  = 1,
    Spam = 2
} mail;

int fill_mail_data(int i, mail* status)
{
    *status = Spam;
    return i+1;
}

%}

Use:使用:

>>> import x
>>> dir(x)    # Note no "mail" object, just Int, Out, Spam which are ints.
['Int', 'Out', 'Spam', '__builtins__', '__cached__', '__doc__', '__file__', '__initializing__', '__loader__', '__name__', '__package__', '_newclass', '_object', '_swig_getattr', '_swig_property', '_swig_repr', '_swig_setattr', '_swig_setattr_nondynamic', '_x', 'fill_mail_data']
>>> x.fill_mail_data(5)
[6, 2]
>>> ret,mail = x.fill_mail_data(5)
>>> mail == x.Spam
True

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM