2013-06-10 32 views
10

Tôi đã nhúng python vào C++ và tôi muốn biết nếu có cách tìm loại của đối tượng tăng :: python :: là kết quả sau khi thực hiện một hàm của một mô-đun python. Tôi có mã của tôi như thế này:Tìm loại đối tượng python tăng

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

Từ đoạn mã trên, những gì tôi muốn biết là nếu có cách để tìm ra loại của kết quả trước khi giải nén nó. Trong mã trên, kết quả_ có thể là bất kỳ loại nào như danh sách, bộ lọc ...

Trả lời

3

Có một vài cách để nhận loại đối tượng. Mà một trong những bạn sử dụng phụ thuộc vào định dạng mà bạn muốn kết quả được. Bạn có thể sử dụng result_.attr("__class__") để có được lớp như là một tăng :: python :: đối tượng. Bạn cũng có thể sử dụng số PyObject_IsInstance function để kiểm tra xem đó có phải là loại bạn nghĩ không. Cuối cùng, bạn có thể sử dụng PyObject_Type function để có được loại của nó như là một PyObject *.

7

Bạn có thể thử này

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

Nó làm việc cho tôi.

2

Vì bạn dường như muốn kiểm tra xem nó là một số nguyên, bạn có thể sử dụng 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 

Các documentation nói:

chiết xuất x (o); xây dựng một bộ giải nén có chức năng thành viên check() có thể được sử dụng để hỏi liệu một chuyển đổi có sẵn mà không gây ra một ngoại lệ được ném ra.

Điều này nghe có vẻ như một phao có thể được coi là có thể chuyển đổi thành số nguyên, nhưng tôi đã thử và không. Nói cách khác, tôi sẽ không thực sự tin tưởng rằng nó làm điều đúng mọi lúc! Đối với các kiểu tích hợp, trong trường hợp này là số nguyên, tôi nghĩ an toàn hơn khi sử dụng PyInt_Check, nhưng ít nhất khi I kiểm tra một số mã ở đây, nó không có sẵn ngay lập tức.

Nói cách khác, nếu bạn cần xác định loại đối tượng không được xây dựng bằng Python, tôi sẽ theo dõi @Aereaux's suggestion sử dụng PyObject_IsInstance. (Nhưng cá nhân tôi muốn tốt hơn để có một cơ sở mã Boost Python sạch, chứ không phải là một kết hợp.)

+0

Như bạn đã đề xuất nó không đáng tin cậy. trích xuất sẽ vui vẻ chấp nhận số nguyên – Sergei

+1

Có. Kể từ bài đăng này, tôi đã nhận ra rằng 'trích xuất' sẽ cố gắng tự động chuyển đổi giữa các loại tương thích. Cách để chắc chắn nó chính xác là một số nguyên là sử dụng 'PyInt_Check'. – csl

Các vấn đề liên quan