Обработка параметров по умолчанию в Cython - PullRequest
12 голосов
/ 22 февраля 2011

Я обертываю некоторый код на C ++ с использованием Cython, и я не уверен, как лучше всего работать с параметрами со значениями по умолчанию.

В моем коде c ++ у меня есть функция, для которой параметры имеют значения по умолчанию. Я хотел бы обернуть их таким образом, чтобы эти значения по умолчанию использовались, если параметры не заданы. Есть ли способ сделать это?

На данный момент единственный способ предоставить параметры параметров - это определить их как часть кода Python (в разделе def func в pycode.pyx ниже), но затем я Я определил значения по умолчанию более одного раза, которые я не хочу.

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 Ответ

9 голосов
/ 23 февраля 2011

Вы можете объявить функцию с различными параметрами ("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=*)
...