2009-09-01 18 views
7

Biorąc pod uwagę obiekt PyObject * wskazujący obiekt Pythona, w jaki sposób wywołać jedną z metod obiektowych? Dokumentacja nie daje tego przykład:Wywoływanie metody na obiekcie

PyObject* obj = .... 
PyObject* args = Py_BuildValue("(s)", "An arg"); 
PyObject* method = PyWHATGOESHERE(obj, "foo"); 
PyObject* ret = PyWHATGOESHERE(obj, method, args); 
if (!ret) { 
    // check error... 
} 

byłoby to równoznaczne z

>>> ret = obj.foo("An arg") 

Odpowiedz

7
PyObject* obj = .... 
PyObject *ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg"); 
if (!ret) { 
    // check error... 
} 

Poczytaj na Python C API documentation. W takim przypadku chcesz uzyskać object protocol.

PyObject* PyObject_CallMethod(PyObject *o, char *method, char *format, ...) 

Zwracana wartość: New odniesienia.

Wywołanie metody o nazwie metoda obiektu o zmiennej liczbie argumentów C . Argumenty C są oznaczone ciągiem, który powinien tworzyć krotkę. Format może być NULL, co oznacza, że ​​ nie zawiera żadnych argumentów. Powoduje zwrócenie wyniku połączenia na powodzenie lub NULL po niepowodzeniu. Jest to odpowiednik wyrażenia Python o.method(args). Zauważ, że , jeśli przejedziesz tylko PyObject * args, PyObject_CallMethodObjArgs(), jest szybszą alternatywą niż .

I

PyObject* PyObject_CallMethodObjArgs(PyObject *o, PyObject *name, ..., NULL) 

Zwracana wartość: New odniesienia.

Wywołuje metodę obiektu o, gdzie podano nazwę metody jako obiekt napisowy Python w nazwie. To jest wywoływane ze zmienną liczbą argumentów PyObject*. Argumenty są dostarczone jako zmienna liczba parametrów , a następnie NULL. Zwraca wynik połączenia po pomyślnym zakończeniu lub NULL w przypadku niepowodzenia.

+0

Wiedząc, co "protokół Object" to był problem. Z jakiegoś powodu szukałem też wywołania. Dzięki. – jmucchiello

3

Twój przykład byłoby:

PyObject* ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg"); 
+0

Wiem, że 7 lat za późno, ale co oznacza (s) w argumencie.? – JMzance

+0

Jest to ten sam format, który jest używany przez Py_BuildValue: parens oznacza, że ​​zbuduje krotkę, s oznacza, że ​​następny argument ("Arg") będzie ciągiem znaków C char, konwertowanym na ciąg znaków Python. Krotka jest używana jako argumenty pozycyjne funkcji, więc przekazujemy jeden ciąg znaków. –

+0

Co jeśli chcę przekazać tablicę c jako listę ciągów lub listę taktów, takich jak '['kks', 'sss', 'www', 'sse']' lub '[323.9, 32, 443, 434.8,56] "? – jaykumarark

Powiązane problemy