在Cython中处理默认参数

16 投票
1 回答
9347 浏览
提问于 2025-04-16 12:18

我正在用Cython封装一些C++代码,但我不太确定处理带有默认值的参数的最佳方法是什么。

在我的C++代码中,有一个函数的参数有默认值。我想把这些参数封装起来,这样如果没有提供参数,就能使用这些默认值。有没有办法做到这一点呢?

目前我能想到的唯一提供可选参数的方法,就是在Python代码中定义它们(在下面的pycode.pyx中的def 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)

1 个回答

18

你可以用不同的参数来声明这个函数("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=*)

撰写回答