0

Python にユーザー定義関数がありますが、引数の数がわかりません。すなわちそれはすることができます

def f1(x,y,z):
  return  sin(x)*cos(y)*tan(z)

また

def f1(x):
  return  sin(x)

Boost-Python を使用して、関数の引数の数を確認するにはどうすればよいですか? 関数の引数が 1 つだけの場合、常に次のように評価できます。

  bp::object f1 = main_dict["f1"];
  std::cout << bp::extract<double>(f1(0.0)) << std::endl;
4

2 に答える 2

2

Python のユーザー定義関数の場合、特別な属性を使用して関数のアリティを抽出できます。func_codeこの属性は、コンパイルされた関数本体をco_argcount表し、関数のアリティを示す属性を提供します。詳細およびその他の可能なアプローチについては、この質問を読むことを検討してください。

エラー チェックを無視すると、Boost.Python の実装はかなり簡単になります。

boost::python::extract<std::size_t>(fn.attr("func_code").attr("co_argcount"));

完全な簡単な例を次に示します。

#include <iostream>
#include <boost/python.hpp>

void print_arity(boost::python::object fn)
{
  std::size_t arity = boost::python::extract<std::size_t>(
                        fn.attr("func_code").attr("co_argcount"));
  std::cout << arity << std::endl;
}

BOOST_PYTHON_MODULE(example)
{
  def("print_arity", &print_arity);
}

そしてその使用法:

>>> from example import print_arity
>>> def f1(x,y,z): pass
... 
>>> print_arity(f1)
3
>>> def f1(x): pass
... 
>>> print_arity(f1)
1
于 2013-01-07T14:47:15.953 に答える
1
def foobar(x, *args):
    return len(args) + 1

パラメータ リストの*argsは、パラメータ リストで明示的に定義されていないすべての追加引数をリストに割り当てますargs(この名前はユーザー定義です)。関数に少なくとも 1 つのパラメーターが必要であると仮定すると、上記の関数は引数の数を返します。

免責事項: Boost.Python の経験はまったくありません。この回答は単なる Python での実装であり、戻り値を C++ に転送するのはユーザー次第です。

于 2013-01-06T21:00:20.243 に答える