1.3 Wróćmy do przykładu

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.