15

我正在使用 cython 包装一些 c++ 代码,但我不确定使用默认值处理参数的最佳方法是什么。

在我的 c++ 代码中,我有参数具有默认值的函数。我想以这样一种方式包装它们,以便在未给出参数的情况下使用这些默认值。有没有办法做到这一点?

在这一点上,我可以看到提供选项参数的唯一方法是将它们定义为 python 代码的一部分(在下面的pycode.pyxdef func中),但是我已经多次定义了我不想要的默认值.

cppcode.h

int init(const char *address=0, int port=0, int en_msg=false, int error=0);


pycode_c.pxd

cdef extern from "cppcode.h":
int func(char *address, int port, int en_msg, int error)


pycode.pyx

cimport pycode_c
def func(address, port, en_msg, error):
    return pycode_c.func(address, port, en_msg, error)
4

1 回答 1

16

您可以使用不同的参数 ( "cppcode.pxd") 声明函数:

cdef extern from "cppcode.hpp":
     int init(char *address, int port, bint en_msg, int error)
     int init(char *address, int port, bint en_msg)
     int init(char *address, int port)
     int init(char *address)
     int init()

哪里"cppcode.hpp"

int init(const char *address=0, int port=0, bool en_msg=false, int error=0);

它可以用于 Cython 代码 ( "pycode.pyx"):

cimport cppcode

def init(address=None,port=None,en_msg=None,error=None):
    if error is not None:
        return cppcode.init(address, port, en_msg, error)
    elif en_msg is not None:
         return cppcode.init(address, port, en_msg)
    elif port is not None:
         return cppcode.init(address, port)
    elif address is not None:
         return cppcode.init(address)
    return cppcode.init()

并在 Python ( "test_pycode.py") 中尝试:

import pycode

pycode.init("address")

输出

address 0 false 0

Cython 还具有可选参数的arg=*语法(在*.pxd文件中):

cdef foo(x=*)
于 2011-02-23T11:27:11.490 回答