2013-06-10 25 views
10

python'u C++ içine gömüyorum ve bir işlev yürüttükten sonra sonucu olan boost :: python :: nesnesinin türünü bulmanın bir yolu olup olmadığını bilmek istiyorum bir python modülünün Yukarıdaki kod parçacığı itibarenDestek python nesnesinin türünü bulma

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_); 

, bunu ayıklanması önce sonuç türünü bulmak için bir yol olup olmadığını olduğunu öğrenmek istiyorum neyi: Bu gibi benim kodu var. Yukarıdaki kodda, sonuç_bir liste gibi olabilir, tuple ...

cevap

3

Nesnenin türünü elde etmenin birkaç yolu vardır. Kullandığınız, sonucun hangi formatta olmasını istediğinize bağlıdır. Sınıfı bir boost :: python :: object olarak almak için result_.attr("__class__")'u kullanabilirsiniz. Bunun olduğunu düşündüğünüz tür olup olmadığını kontrol etmek için PyObject_IsInstance function'u da kullanabilirsiniz. Son olarak, bir PyObject * olarak almak için PyObject_Type function'u kullanabilirsiniz.

7

Sen Bana uyar bu

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; 
    } 
    ................................................... 
    ................................................... 
} 

deneyebilirsiniz. Eğer bir tamsayı olup olmadığını kontrol etmek istiyorum görünmektedir yana

2

, sen extract<T> x(o) kullanabilirsiniz:

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

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

documentation diyor ki:

özü x (o); 'a neden olmadan bir dönüşümün mevcut olup olmadığını sormak için check() üye işlevi olan bir çıkarıcıyı oluşturur.

bir şamandıra tamsayı dönüştürülebilir kabul edilebilir sanki bu gelebilir, ama ben denedim ve öyle değil. Başka bir deyişle, her seferinde doğru olanı yapmaya gerçekten güvenmem. Yerleşik türleri için

, bu durumda bir tamsayı içinde, ben PyInt_Check kullanmak daha güvenli olduğunu düşünüyorum, ama benburada bazı kodlar test edildiğinde, en azından, hemen mevcut değildi.

Başka bir deyişle, Python yerleşik olmayan nesnelerin türünü belirlemeniz gerekiyorsa, PyObject_IsInstance'u kullanarak @Aereaux's suggestion'u takip ediyorum. (Ama kişisel olarak bir karışımdan ziyade temiz bir Güçlendirme Python kod tabanına sahip olmak daha iyi olurdu.)

+0

Güvenilir olmadığını düşündüğünüz gibi. özü, tamsayıları tam olarak kabul edecek – Sergei

+1

Evet. Bu gönderiden beri, 'extract'ın uyumlu tipler arasında otomatik olarak dönüşüm yapmaya çalışacağını fark ettim. Tam olarak bir tamsayı olduğundan emin olmanın yolu 'PyInt_Check' kullanmaktır. – csl

İlgili konular