如何在swig和python中使用enum?

如何在swig和python中使用enum?,python,enums,swig,Python,Enums,Swig,我有一个enum声明,如下所示: typedef枚举邮件\u{ Out=0, Int=1, 垃圾邮件=2 }邮寄; 功能: 邮件状态; 整数填充\邮件\数据(整数i和状态); 在上面的函数中,status将被填充并发送 当我通过swig尝试这一点时,我面临以下问题: 它不显示邮件的详细信息。当我试图打印邮件。或帮助(邮件)时,它会抛出一个错误,说没有这样的属性,尽管我可以使用这些值(垃圾邮件,输入,以及输出) 如上所示,Swig不知道什么是main,因此它不接受该mail的任何函数参数 对于

我有一个enum声明,如下所示:

typedef枚举邮件\u{
Out=0,
Int=1,
垃圾邮件=2
}邮寄;
功能:

邮件状态;
整数填充\邮件\数据(整数i和状态);
在上面的函数中,
status
将被填充并发送

当我通过swig尝试这一点时,我面临以下问题:

  • 它不显示
    邮件的详细信息。当我试图打印
    邮件。
    帮助(邮件)
    时,它会抛出一个错误,说没有这样的属性,尽管我可以使用这些值(
    垃圾邮件
    输入
    ,以及
    输出
  • 如上所示,Swig不知道什么是
    main
    ,因此它不接受该
    mail
    的任何函数参数

  • 对于SWIG来说,
    enum
    只是一个整数。要将其用作示例中的输出参数,还可以将该参数声明为输出参数,如下所示:

    %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;
    }
    
    %}
    
    >>> 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