boost/python/args.hpp
ファイルには、引数キーワードを指定するためのクラスファミリが用意されています。特に、Boost.Pythonは潜在的なキーワード引数を表すarg
タイプを提供します。コンマ演算子をオーバーロードして、引数リストのより自然な定義を可能にします。ここで
BOOST_PYTHON_MODULE(example)
{
namespace python = boost::python;
python::class_<MyClass>("MyClass")
.def("my_function", &MyClass::myFunction,
(python::arg("a"), "b", python::arg("c")=0))
;
}
は完了です:a
、b
、およびc
はキーワード引数であり、c
は次のように0
のデフォルト値が書き込まれる可能性がありmy_function
、などMyClass
にmyFunction
を公開
例:
#include <boost/python.hpp>
class MyClass
{
public:
double myFunction(int a, int b, int c)
{
return a + b + c;
}
};
BOOST_PYTHON_MODULE(example)
{
namespace python = boost::python;
python::class_<MyClass>("MyClass")
.def("my_function", &MyClass::myFunction,
(python::arg("a"), "b", python::arg("c")=0))
;
}
対話型使用法:完全に働いた、そしてそれは私が知らず知らずのうちにその関数の引数をオーバーロードするために別の関数に同様の設定を使用したいことを少し恥ずかしいです
>>> import example
>>> my_class = example.MyClass()
>>> my_class.my_function(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
MyClass.my_function(MyClass, int)
did not match C++ signature:
my_function(MyClass {lvalue}, int a, int b, int c=0)
>>> assert(5 == my_class.my_function(2, 3))
>>> assert(6 == my_class.my_function(2, 3, 1))
>>> my_class.my_function(2, 3, 1, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
MyClass.my_function(MyClass, int, int, int, int)
did not match C++ signature:
my_function(MyClass {lvalue}, int a, int b, int c=0)
>>> assert(6 == my_class.my_function(3, 1, c=2))
>>> assert(7 == my_class.my_function(a=2, b=2, c=3))
>>> my_class.my_function(b=2, c=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
MyClass.my_function(MyClass)
did not match C++ signature:
my_function(MyClass {lvalue}, int a, int b, int c=0)
。これはコンストラクタでも使えますか? – orentago
私自身の質問に答えるには:そうです。 Py :: init((py :: arg( "a")、py :: arg( "b")...))引数タイプをリストします。 –
orentago
(誰でもこの作業に問題がある場合は、argsを囲む追加の括弧に注意してください) – ricab