2011-06-28 16 views
10

Mam funkcji Pythona z tym podpisem:Jak przejść kwargs do funkcji pakowania boost-python?

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

chciałbym wywołania funkcji z C++ i przekazać mu pewne kwargs. Wywołanie funkcji nie jest problemem. Wiedząc, jak przekazać kwargs jest. Oto nieprodukcyjnym sparafrazować próbki:

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) 

Kiedy ćwiczę tego kodu, w WPB I Get (która nie jest to, co chciałbym):

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

Jak przekazać opcje w moim przykładzie w słowniku ** kwargs?

Widziałem jedną post sugerujące użycie opcji składni ** (jak fajne jest to!):

python_func(message, arguments, **options) 

Niestety, powoduje to

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

Dziękuję za wszelką pomoc ty może dać.

Odpowiedz

13

Po pewnym dochodzenia, okazuje się, że obiekt operator wywołania funkcji jest przesłonięta przez dwa argumenty typu args_proxy i kwds_proxy. Więc musisz użyć tego konkretnego stylu wywołania dwóch argumentów.

args_proxy i kwds_proxy są generowane przez * przeciążenia. To naprawdę miłe.

Dodatkowo, pierwszy argument musi być krotką, aby interpreter python poprawnie obsłużył argument * args.

Powstały przykład działa:

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) 

Nadzieja to pomaga ...

+2

Wow, nie wiedziałem o czym * oraz ** przeciążenia, jedna z tych drobnych szczegółów, które sprawiają, boost :: python godne podziwu. – eudoxos