Wróćmy do naszej przykładowej funkcji. Następujący fragment powinien być zrozumiały:
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
Funkcja zwraca NULL (wartość sygnalizującą błąd dla funkcji zwracających wskaźnik) jeśli napotka błąd podczas przetwarzania listy argumentów, polegając na wyjątku wywołanym przez PyArg_ParseTuple(). W przeciwnym wypadku wartość napisowa argumentu zostaje skopiowana do lokalnej zmiennej command. Jest to przypisanie wskaźników i nie należy modyfikować zmiennej napisowej wskazywanej przez ten wskaźnik (dlatego w standardzie języka C zmienna command powinna być zadeklarowana jako "const char *command").
Kolejny fragment jest wywołaniem bibliotecznej funkcji system() systemu Unix, przekazując jej napis uzyskany przed chwilą z funkcji PyArg_ParseTuple():
sts = system(command);
Nasza funkcja spam.system() musi zwracać wartość sts jako obiekt Pythona. Można tego dokonać z udziałem funkcji Py_BuildValue(), która jest niejako odwrotnością PyArg_ParseTuple(): pobiera napis formatujący i dowolną liczbę zmiennych języka C zwracając obiekt Pythona. Więcej szczegółów dotyczących funkcji Py_BuildValue() znajduje się w dalszej części.
return Py_BuildValue("i", sts);
W tym przypadku zwrócony zostanie obiekt liczby całkowitej (tak, nawet liczby całkowite są obiektami stosu Pythona!).
Jeśli mamy do czynienia z funkcją w C nie zwracającą żadnych argumentów
(to znaczy typem rezultatu funkcji jest void), odpowiadająca jej
funkcja w Pythonie musi zwracać None. Dla tego celu należy
posłużyć się następującym zapisem:
Py_INCREF(Py_None);
return Py_None;
Py_None jest nazwą w języku C dla specjalnego obiektu Pythona o
nazwie None. Jest to pełnoprawny obiekt Pythona, nie zaś wskaźnik
NULL, który, jak mieliśmy okazję zauważyć, oznacza to samo co "błąd".
Zajrzyj do Informacji na temat tej publikacji... aby pomóc w jej rozwoju.