处理cython中的默认参数

ami*_*tas 12 c++ python cython

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

在我的c ++代码中,我有参数具有默认值的函数.我想以这样的方式包装它们,如果没有给出参数,则使用这些默认值.有没有办法做到这一点?

在这一点上,我能看到提供选项参数的唯一方法是将它们定义为python代码的一部分(在下面的def funcpycode.pyx中的声明中),但是我有多次定义的默认值,我不想要.

cppcode.h:

int init(const char *address=0, int port=0, int en_msg=false, int error=0);
Run Code Online (Sandbox Code Playgroud)


pycode_c.pxd:

cdef extern from "cppcode.h":
int func(char *address, int port, int en_msg, int error)
Run Code Online (Sandbox Code Playgroud)


pycode.pyx:

cimport pycode_c
def func(address, port, en_msg, error):
    return pycode_c.func(address, port, en_msg, error)
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 10

您可以使用不同的参数("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()
Run Code Online (Sandbox Code Playgroud)

地点"cppcode.hpp":

int init(const char *address=0, int port=0, bool en_msg=false, int error=0);
Run Code Online (Sandbox Code Playgroud)

它可以在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()
Run Code Online (Sandbox Code Playgroud)

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

import pycode

pycode.init("address")
Run Code Online (Sandbox Code Playgroud)

产量

address 0 false 0
Run Code Online (Sandbox Code Playgroud)

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

cdef foo(x=*)
Run Code Online (Sandbox Code Playgroud)