2011-06-28 57 views
10

我有這個簽名Python函數:你如何將kwargs傳遞給boost-python函數?

def post_message(self, message, *args, **kwargs): 

我想從C++調用函數,並傳遞給它一些kwargs。調用函數不是問題。知道如何通過kwargs是。這是一個非工作轉述樣本:

std::string message("aMessage"); 
boost::python::list arguments; 
arguments.append("1"); 

boost::python::dict options; 
options["source"] = "cpp"; 

boost::python::object python_func = get_python_func_of_wrapped_object() 
python_func(message, arguments, options) 

當我行使該代碼,在PDB我得到(這是不是我要什麼):

messsage = aMessage 
args = (['1'], {'source': 'cpp'}) 
kwargs = {} 

你如何通過選項在我的例子中,在** kwargs字典?

我看到一個post建議使用**語法選項(如何的酷是這個!):

python_func(message, arguments, **options) 

不幸的是,這會導致

TypeError: No to_python (by-value) converter found for C++ type: class boost::python::detail::kwds_proxy 

感謝您的幫助,您可以給。

回答

13

經過一番調查,原來該對象函數調用操作中被忽略類型args_proxykwds_proxy的兩個參數。所以你必須使用這個具體的兩個參數的調用樣式。

args_proxykwds_proxy由*重載生成。這真的很好。

此外,第一個參數必須是一個元組類型,以便python解釋器正確處理* args參數。

產生的示例工作:

boost::python::list arguments; 
arguments.append("aMessage"); 
arguments.append("1"); 

boost::python::dict options; 
options["source"] = "cpp"; 

boost::python::object python_func = get_python_func_of_wrapped_object() 
python_func(*boost::python::tuple(arguments), **options) 

希望這有助於...

+2

哇,我不知道沒有對*和**過載,這些微小的細節一個,這使得升壓::蟒蛇令人欽佩。 – eudoxos