15

cythonを使用していくつかのc++コードをラップしていますが、デフォルト値でパラメーターを処理するための最良の方法がわかりません。

私のc++コードには、パラメーターがデフォルト値を持つ関数があります。パラメータが指定されていない場合にこれらのデフォルト値が使用されるように、これらをラップしたいと思います。これを行う方法はありますか?

この時点で、オプションパラメータを提供するために私が見ることができる唯一の方法は、それらをpythonコードの一部として定義することです(以下のdef funcpycode.pyxのsatementで)が、デフォルトが複数回定義されていますが、これは望ましくありません。

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 に答える