Funktionsobjekte

Es gibt einige Funktionen, die spezifisch für Python-Funktionen sind.

type PyFunctionObject

Die C-Struktur, die für Funktionen verwendet wird.

PyTypeObject PyFunction_Type

Dies ist eine Instanz von PyTypeObject und repräsentiert den Python-Funktionstyp. Sie wird Python-Programmierern als types.FunctionType zur Verfügung gestellt.

int PyFunction_Check(PyObject *o)

Gibt wahr zurück, wenn o ein Funktions-Objekt ist (Typ PyFunction_Type). Der Parameter darf nicht NULL sein. Diese Funktion schlägt niemals fehl.

PyObject *PyFunction_New(PyObject *code, PyObject *globals)
Rückgabewert: Neue Referenz.

Gibt ein neues Funktions-Objekt zurück, das mit dem Code-Objekt code verknüpft ist. globals muss ein Wörterbuch mit den globalen Variablen sein, auf die von der Funktion zugegriffen werden kann.

Der Docstring und der Name der Funktion werden aus dem Code-Objekt abgerufen. __module__ wird aus globals abgerufen. Die Argument-Defaults, Annotationen und der Closure werden auf NULL gesetzt. __qualname__ wird auf denselben Wert gesetzt wie das Feld co_qualname des Code-Objekts.

PyObject *PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname)
Rückgabewert: Neue Referenz.

Wie PyFunction_New(), aber erlaubt auch das Setzen des Attributs __qualname__ des Funktions-Objekts. qualname sollte ein Unicode-Objekt oder NULL sein; wenn NULL, wird das Attribut __qualname__ auf denselben Wert wie das Feld co_qualname des Code-Objekts gesetzt.

Hinzugefügt in Version 3.3.

PyObject *PyFunction_GetCode(PyObject *op)
Rückgabewert: Entliehene Referenz.

Gibt das Code-Objekt zurück, das mit dem Funktions-Objekt op verknüpft ist.

PyObject *PyFunction_GetGlobals(PyObject *op)
Rückgabewert: Entliehene Referenz.

Gibt das Globals-Dictionary zurück, das mit dem Funktions-Objekt op verknüpft ist.

PyObject *PyFunction_GetModule(PyObject *op)
Rückgabewert: Entliehene Referenz.

Gibt eine ausgeliehene Referenz auf das Attribut __module__ des Funktions-Objekts op zurück. Es kann NULL sein.

Dies ist normalerweise ein String, der den Modulnamen enthält, kann aber von Python-Code auf jedes andere Objekt gesetzt werden.

PyObject *PyFunction_GetDefaults(PyObject *op)
Rückgabewert: Entliehene Referenz.

Gibt die Argument-Standardwerte des Funktions-Objekts op zurück. Dies kann ein Tupel von Argumenten oder NULL sein.

int PyFunction_SetDefaults(PyObject *op, PyObject *defaults)

Setzt die Argument-Standardwerte für das Funktions-Objekt op. defaults muss Py_None oder ein Tupel sein.

Löst SystemError aus und gibt bei einem Fehler -1 zurück.

void PyFunction_SetVectorcall(PyFunctionObject *func, vectorcallfunc vectorcall)

Setzt das Vektordatenfeld eines gegebenen Funktions-Objekts func.

Warnung: Erweiterungen, die diese API verwenden, müssen das Verhalten der unveränderten (Standard-)Vektordatenfunktion beibehalten!

Hinzugefügt in Version 3.12.

PyObject *PyFunction_GetKwDefaults(PyObject *op)
Rückgabewert: Entliehene Referenz.

Gibt die Standardwerte für schlüsselwortbezogene Argumente des Funktions-Objekts op zurück. Dies kann ein Wörterbuch von Argumenten oder NULL sein.

PyObject *PyFunction_GetClosure(PyObject *op)
Rückgabewert: Entliehene Referenz.

Gibt den Closure zurück, der mit dem Funktions-Objekt op verknüpft ist. Dies kann NULL oder ein Tupel von Cell-Objekten sein.

int PyFunction_SetClosure(PyObject *op, PyObject *closure)

Setzt den Closure, der mit dem Funktions-Objekt op verknüpft ist. closure muss Py_None oder ein Tupel von Cell-Objekten sein.

Löst SystemError aus und gibt bei einem Fehler -1 zurück.

PyObject *PyFunction_GetAnnotations(PyObject *op)
Rückgabewert: Entliehene Referenz.

Gibt die Annotationen des Funktions-Objekts op zurück. Dies kann ein veränderbares Wörterbuch oder NULL sein.

int PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)

Setzt die Annotationen für das Funktions-Objekt op. annotations muss ein Wörterbuch oder Py_None sein.

Löst SystemError aus und gibt bei einem Fehler -1 zurück.

PyObject *PyFunction_GET_CODE(PyObject *op)
PyObject *PyFunction_GET_GLOBALS(PyObject *op)
PyObject *PyFunction_GET_MODULE(PyObject *op)
PyObject *PyFunction_GET_DEFAULTS(PyObject *op)
PyObject *PyFunction_GET_KW_DEFAULTS(PyObject *op)
PyObject *PyFunction_GET_CLOSURE(PyObject *op)
PyObject *PyFunction_GET_ANNOTATIONS(PyObject *op)
Rückgabewert: Entliehene Referenz.

Diese Funktionen sind ihren PyFunction_Get* Gegenstücken ähnlich, führen aber keine Typüberprüfung durch. Die Übergabe von etwas anderem als einer Instanz von PyFunction_Type hat undefiniertes Verhalten.

int PyFunction_AddWatcher(PyFunction_WatchCallback callback)

Registriert callback als Funktions-Watcher für den aktuellen Interpreter. Gibt eine ID zurück, die an PyFunction_ClearWatcher() übergeben werden kann. Im Fehlerfall (z. B. keine weiteren Watcher-IDs verfügbar) gibt die Funktion -1 zurück und setzt eine Exception.

Hinzugefügt in Version 3.12.

int PyFunction_ClearWatcher(int watcher_id)

Löscht den Watcher, der durch watcher_id identifiziert wird und zuvor von PyFunction_AddWatcher() für den aktuellen Interpreter zurückgegeben wurde. Gibt 0 bei Erfolg zurück oder -1 und setzt eine Exception im Fehlerfall (z. B. wenn die angegebene watcher_id nie registriert wurde).

Hinzugefügt in Version 3.12.

type PyFunction_WatchEvent

Aufzählung möglicher Funktions-Watcher-Ereignisse

  • PyFunction_EVENT_CREATE

  • PyFunction_EVENT_DESTROY

  • PyFunction_EVENT_MODIFY_CODE

  • PyFunction_EVENT_MODIFY_DEFAULTS

  • PyFunction_EVENT_MODIFY_KWDEFAULTS

Hinzugefügt in Version 3.12.

typedef int (*PyFunction_WatchCallback)(PyFunction_WatchEvent event, PyFunctionObject *func, PyObject *new_value)

Typ einer Funktions-Watcher-Callback-Funktion.

Wenn event PyFunction_EVENT_CREATE oder PyFunction_EVENT_DESTROY ist, ist new_value NULL. Andernfalls enthält new_value eine ausgeliehene Referenz auf den neuen Wert, der in func für das zu ändernde Attribut gespeichert werden soll.

Der Callback kann func inspizieren, darf ihn aber nicht modifizieren; dies könnte unvorhersehbare Auswirkungen haben, einschließlich einer Endlosschleife.

Wenn event PyFunction_EVENT_CREATE ist, wird der Callback aufgerufen, nachdem func vollständig initialisiert wurde. Andernfalls wird der Callback vor der Änderung von func aufgerufen, sodass der vorherige Zustand von func inspiziert werden kann. Die Laufzeitumgebung darf die Erstellung von Funktions-Objekten nach Möglichkeit optimieren. In solchen Fällen wird kein Ereignis ausgegeben. Obwohl dies die Möglichkeit eines erkennbaren Unterschieds im Laufzeitverhalten je nach Optimierungsentscheidungen schafft, ändert es nicht die Semantik des ausgeführten Python-Codes.

Wenn event PyFunction_EVENT_DESTROY ist, wird durch das Ergreifen einer Referenz im Callback auf die kurz vor der Zerstörung stehende Funktion diese wiederhergestellt und verhindert, dass sie zu diesem Zeitpunkt freigegeben wird. Wenn das wiederhergestellte Objekt später zerstört wird, werden alle zu diesem Zeitpunkt aktiven Watcher-Callbacks erneut aufgerufen.

Wenn der Callback eine Ausnahme setzt, muss er -1 zurückgeben; diese Ausnahme wird als nicht aufhebbare Ausnahme mit PyErr_WriteUnraisable() ausgegeben. Andernfalls sollte er 0 zurückgeben.

Es kann bereits eine ausstehende Ausnahme beim Eintritt in den Callback gesetzt sein. In diesem Fall sollte der Callback 0 zurückgeben, wobei die Ausnahme weiterhin gesetzt ist. Das bedeutet, der Callback darf keine andere API aufrufen, die eine Ausnahme setzen kann, es sei denn, er speichert und löscht zuerst den Ausnahmezustand und stellt ihn vor der Rückgabe wieder her.

Hinzugefügt in Version 3.12.