14

Python を C++ に埋め込んでいますが、Python モジュールの関数を実行した後の結果である boost::python::object の型を見つける方法があるかどうかを知りたいです。私は次のようなコードを持っています:

boost::python::object module_ = boost::python::import("..libName");
boost::python::object result_ = module_.attr("..functionName")(arg1, arg2,...);
//suppose if the result is int,
int a_ = boost::python::extract<int>(result_);

上記のコード スニペットから、私が知りたいのは、結果を抽出する前に結果の型を見つける方法があるかどうかです。上記のコードでは、result_ はリスト、タプルなどの任意の型である可能性があります...

4

3 に答える 3

12

これを試すことができます

std::vector<std::string> list_to_vector(boost::python::list& l)
{
    for (int i = 0; i < len(n); ++i)
    {
        boost::python::extract<boost::python::object> objectExtractor(l[i]);
        boost::python::object o=objectExtractor();
        std::string object_classname = boost::python::extract<std::string>(o.attr("__class__").attr("__name__"));
        std::cout<<"this is an Object: "<<object_classname<<std::endl;
    }
    ...................................................
    ...................................................
 }

わたしにはできる。

于 2013-12-28T16:50:11.343 に答える
4

整数かどうかを確認したいようなので、次を使用できますextract<T> x(o)

boost::python::extract<int> n(o);

if ( n.check() )
    // it's an integer, or at least convertible to one
else
    // not an integer

ドキュメントには次のように記載されています。

x(o) を抽出します。check() メンバー関数を使用して、例外をスローせずに変換が可能かどうかを問い合わせることができるエクストラクタを構築します。

これは、 float がinteger に変換可能であると見なされるかのように聞こえるかもしれませんが、試してみましたが、そうではありません。言い換えれば、私はそれが毎回正しいことをするとは本当に信じていません!

組み込み型 (この場合は整数) については、 を使用する方が安全だと思いますPyInt_Checkが、少なくともここでいくつかのコードテストしたときは、すぐには使用できませんでした。

言い換えれば、Python 組み込みではないオブジェクトのタイプを判別する必要がある場合は、@Aereaux の使用に関する提案に従いますPyObject_IsInstance。(しかし、私は個人的には、ミックスではなく、クリーンな Boost Python コード ベースを使用したいと考えています。)

于 2015-01-16T14:24:28.457 に答える
4

オブジェクトの型を取得するには、いくつかの方法があります。どちらを使用するかは、結果をどのような形式にしたいかによって異なります。result_.attr("__class__")クラスをboost::python::objectとして取得するために使用できます。PyObject_IsInstance 関数を使用して、それが自分の考えているタイプかどうかを確認することもできます。最後に、PyObject_Type 関数を使用して、その型を PyObject* として取得できます。

于 2013-06-15T02:48:12.570 に答える