【问题标题】:how to use enum in swig with python?如何在 swig 中与 python 一起使用枚举?
【发布时间】:2013-11-19 14:06:21
【问题描述】:

我有一个枚举声明如下:

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

功能:

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

在上面的函数中,status 被填满并发送。

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

  1. 没有显示mail 的详细信息。当我尝试打印mail.__doc__help(mail) 时,它会抛出一个错误,说没有这样的属性,尽管我可以使用这些值(SpamInOut)。
  2. 如上所示,Swig 不知道main 是什么,因此它不接受mail 的任何函数参数。

【问题讨论】:

    标签: python enums swig


    【解决方案1】:

    对于 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 2011-07-02
      • 1970-01-01
      相关资源
      最近更新 更多