Python C Extension – Warum sind Methoden, die Keyword-Argumente verwenden, die in PyCFunction gegossen werden

Ich lerne über Python-C-Erweiterungen und bin verwirrt darüber, warum Methoden, die Keyword-Argumente verwenden, in PyCFunctions geworfen werden müssen.

Mein Verständnis von einer PyCFunction ist, dass es zwei Zeiger auf PyObjects nimmt und einen einzelnen Zeiger auf ein PyObject zurückgibt – zB

  • Mein tkinter gui ist aus unbekannten Gründen unsichtbar
  • Asynchrone Dateischrift möglich in Python?
  • Wann zu verwenden und wenn nicht zu verwenden Python 3.5 `await`?
  • Python- und JSON-TypeError-Listenindizes müssen ganze Zahlen sein
  • Was sind die Risiken des Laufen 'sudo pip'?
  • Warum müssen die Setup- und Plot-Befehle in der gleichen Zelle in einem IPython-Notebook sein?
  • PyObject* myFunc(PyObject* self, PyObject* args) 

    Wenn ich eine Funktion verwende, die Keyword-Argumente verwendet, dann wird diese Funktion drei Zeiger auf PyObjects und gibt einen einzelnen Zeiger auf ein PyObject zurück – zB

      PyObject* myFunc(PyObject* self, PyObject* args, PyObject* keywordArgs) 

    Allerdings, wenn ich das Modul Funktionen Array (für eine Funktion namens 'Addierer'):

     { "adder", (PyCFunction)adder, METH_VARARGS | METH_KEYWORDS, "adder method" } 

    funktioniert gut. Es fühlt sich an, als würde ich einen Schwimmer zu einem int werfen und immer noch die nicht-ganzzahligen Teile des Schwimmers benutzen. Wenn ich diese Arbeit nicht gesehen hätte, hätte ich gedacht, dass es nicht funktionieren würde. Was verstehe ich hier nicht?

    Außerdem habe ich einige Verweise auf eine PyCFunctionWithKeywords gesehen, die die Funktion Signatur zu haben scheint Ich dachte, ich brauchte, aber mein Compiler beschwerte (gab Warnungen) über "inkompatible Zeigertypen".

    Wurde PyCFunctionWithKeywords veraltet? Wenn nicht, gibt es eine Zeit, in der ich es benutzen sollte

  • Tastaturunterbrechung mit python gtk?
  • Verschieben einer großen SQL-Abfrage zu NumPy
  • Bestimmen Sie die maximale Anzahl von Spalten aus sqlite3
  • Probleme mit der Verwendung von timeit in ipython
  • Barchart mit vertikalen Etiketten in Python / Matplotlib
  • Wie man x-Achse in matplotlib anpasst
  • One Solution collect form web for “Python C Extension – Warum sind Methoden, die Keyword-Argumente verwenden, die in PyCFunction gegossen werden”

    Wenn Ihre Funktion Keyword-Argumente behandelt, muss sie einem PyCFunctionWithKeywords entsprechen. Allerdings macht C keine Überladung, und die von PyMethodDef erstellte Struktur ist definiert, um eine PyCFunction zu erwarten, anstatt einen völlig unkontrollierten void * zu sagen. Du musst also deine PyCFunctionWithKeywords auf eine PyCFunction werfen, um den Compiler zu beschweren, das ist alles.

    Denken Sie daran, dass Sie auch METH_KEYWORDS in den Flags übergeben müssen, um Python zu sagen, dass Ihre Funktion die Signatur eines PyCFunctionWithKeywords hat, nicht eine PyCFunction.

    Python ist die beste Programmiersprache der Welt.