17

私はこの署名を持つ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ディクショナリの私の例のオプションをどのように渡しますか?

** options構文の使用を提案している投稿を見たことがあります(これはなんてクールなことでしょう!):

python_func(message, arguments, **options)

残念ながら、これは結果として

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

あなたが与えることができるどんな助けにも感謝します。

4

1 に答える 1

20

調査の結果、オブジェクト関数呼び出し演算子は、型args_proxyとの 2 つの引数に対してオーバーライドされていることがわかりましkwds_proxyた。したがって、2 つの引数のこの特定の呼び出しスタイルを使用する必要があります。

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)

お役に立てれば...

于 2011-06-29T19:32:54.630 に答える