boost/python/args.hpp
文件提供了一系列用於指定參數關鍵字的類。特別是,Boost.Python提供了一個arg
類型,它表示一個潛在的關鍵字參數。它重載逗號運算符以允許更自然地定義參數列表。
上MyClass
暴露myFunction
爲my_function
,其中a
,b
和c
的關鍵詞參數,並c
有0
默認值可以按如下方式寫入:
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))
;
}
下面是一個完整例如:
#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