Function オブジェクト

Functionオブジェクト固有の関数はわずかです。

type PyFunctionObject

関数に使われるCの構造体。

PyTypeObject PyFunction_Type

PyTypeObject 型のインスタンスで、 Python の関数型を表します。これは Python プログラムに types.FunctionType として公開されています。

int PyFunction_Check(PyObject *o)

o が関数オブジェクト (PyFunction_Type 型である) 場合に真を返します。パラメータは NULL にできません。この関数は常に成功します。

PyObject *PyFunction_New(PyObject *code, PyObject *globals)
戻り値: 新しい参照。

コードオブジェクト code に関連付けられた新しい関数オブジェクトを返します。globals はこの関数からアクセスできるグローバル変数の辞書でなければなりません。

関数のドキュメント文字列と名前はコードオブジェクトから取得されます。 __module__ は globals から取得されます。 引数のデフォルト値やアノテーション、クロージャは NULL に設定されます。 __qualname__ はコードオブジェクトの co_qualname フィールドと同じ値に設定されます。

PyObject *PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname)
戻り値: 新しい参照。

PyFunction_New() に似ていますが、関数オブジェクトの __qualname__ 属性に値をセットできます。 qualname はユニコードオブジェクトか NULL でなくてはなりません。NULL だった場合、 __qualname__ 属性にはコードオブジェクトの co_qualname フィールドと同じ値がセットされます。

Added in version 3.3.

PyObject *PyFunction_GetCode(PyObject *op)
戻り値: 借用参照。

関数オブジェクト op に関連付けられたコードオブジェクトを返します。

PyObject *PyFunction_GetGlobals(PyObject *op)
戻り値: 借用参照。

関数オブジェクト op に関連付けられたglobals辞書を返します。

PyObject *PyFunction_GetModule(PyObject *op)
戻り値: 借用参照。

関数オブジェクト op の __module__ 属性への 借用参照 を返します。 NULL の場合もあります。

通常はモジュール名を含む 文字列 ですが、Python コードで任意の別のオブジェクトに設定できます。

PyObject *PyFunction_GetDefaults(PyObject *op)
戻り値: 借用参照。

関数オブジェクト op の引数のデフォルト値を返します。 引数のタプルか NULL になります。

int PyFunction_SetDefaults(PyObject *op, PyObject *defaults)

関数オブジェクト op の引数のデフォルト値を設定します。 defaults は Py_None かタプルでなければいけません。

失敗した時は、 SystemError を発生させ、 -1 を返します。

void PyFunction_SetVectorcall(PyFunctionObject *func, vectorcallfunc vectorcall)

指定された関数オブジェクト func の vectorcall フィールドを設定します。

警告: この API を使う拡張は、変更前の (デフォルトの) vectorcall 関数の動作を維持しなければなりません。

Added in version 3.12.

PyObject *PyFunction_GetKwDefaults(PyObject *op)
戻り値: 借用参照。

関数オブジェクト op のキーワード専用引数のデフォルト値を返します。 引数の辞書、または NULL です。

int PyFunction_SetKwDefaults(PyObject *op, PyObject *defaults)

関数オブジェクト op のキーワード専用引数のデフォルト値を設定します。 defaults はキーワード専用引数の辞書、または Py_None でなければなりません。

成功した場合は 0 を返し、失敗した場合は例外を設定して -1 を返します。

PyObject *PyFunction_GetClosure(PyObject *op)
戻り値: 借用参照。

関数オブジェクト op に設定されたクロージャを返します。 NULL か cell オブジェクトのタプルです。

int PyFunction_SetClosure(PyObject *op, PyObject *closure)

関数オブジェクト op にクロージャを設定します。 closure は、Py_None もしくは cell オブジェクトのタプルでなければなりません。

失敗した時は、 SystemError を発生させ、 -1 を返します。

PyObject *PyFunction_GetAnnotations(PyObject *op)
戻り値: 借用参照。

関数オブジェクト op のアノテーションを返します。 返り値は修正可能な辞書か NULL になります。

int PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)

関数オブジェクト op のアノテーションを設定します。 annotations は辞書か、Py_None でなければなりません。

失敗した時は、 SystemError を発生させ、 -1 を返します。

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)
戻り値: 借用参照。

これらの関数は、対応する PyFunction_Get* 関数と同様ですが、型のチェックを行いません。 PyFunction_Type のインスタンス以外を渡すと、動作は未定義です。

int PyFunction_AddWatcher(PyFunction_WatchCallback callback)

現在のインタープリタの関数ウォッチャーとして callback を登録します。 PyFunction_ClearWatcher() に渡せる ID を返します。 エラーの場合 (例えば利用可能なウォッチャー ID がない場合) は、例外を設定して -1 を返します。

Added in version 3.12.

int PyFunction_ClearWatcher(int watcher_id)

現在のインタープリタについて、PyFunction_AddWatcher() が以前返した watcher_id で識別されるウォッチャーを解除します。 成功した場合は 0 を返します。 エラーの場合 (例えば指定した watcher_id が登録されていない場合) は、例外を設定して -1 を返します。

Added in version 3.12.

type PyFunction_WatchEvent

関数ウォッチャーで発生し得るイベントの列挙型。

  • PyFunction_EVENT_CREATE

  • PyFunction_EVENT_DESTROY

  • PyFunction_EVENT_MODIFY_CODE

  • PyFunction_EVENT_MODIFY_DEFAULTS

  • PyFunction_EVENT_MODIFY_KWDEFAULTS

Added in version 3.12:

  • PyFunction_EVENT_MODIFY_QUALNAME

Added in version 3.15.

PY_FOREACH_FUNC_EVENT(V)

PyFunction_WatchEvent 定数の各接尾辞にマクロ V を適用します。 現在は V(CREATE) V(DESTROY) V(MODIFY_CODE) V(MODIFY_DEFAULTS) V(MODIFY_KWDEFAULTS) V(MODIFY_QUALNAME) に展開されます。 マクロ V は一つのイベント名を受け取り、展開結果の間に必要な区切り記号を補う必要があります。

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

関数ウォッチャーのコールバック関数の型。

event が PyFunction_EVENT_CREATE または PyFunction_EVENT_DESTROY の場合、new_value は NULL です。 それ以外の場合、new_value は func の変更対象の属性に格納しようとしている新しい値への 借用参照 です。

コールバックは func を調べても構いませんが、変更してはいけません。 変更すると、無限再帰など予測できない結果を招く可能性があります。

event が PyFunction_EVENT_CREATE の場合、コールバックは func の初期化がすべて完了した後で呼び出されます。 それ以外の場合は func を変更する前に呼び出されるので、変更前の状態を調べられます。 ランタイムは、可能であれば最適化によって関数オブジェクトの作成を省略しても構いません。 その場合、イベントは発生しません。 このため、最適化の判断によって観測できる実行時の動作に違いが生じる可能性はありますが、実行される Python コードの意味は変わりません。

event が PyFunction_EVENT_DESTROY の場合、コールバック内で破棄されようとしている関数への参照を取得すると、その関数が復活し、この時点での解放を防ぎます。 復活したオブジェクトが後で破棄されるときは、その時点で有効なウォッチャーのコールバックが再び呼び出されます。

コールバックが例外を設定した場合は -1 を返す必要があります。 その例外は、PyErr_WriteUnraisable() を使って送出できない例外として表示されます。 それ以外の場合は 0 を返してください。

コールバックに入る時点で、すでに処理待ちの例外が設定されている場合があります。 その場合、コールバックは同じ例外を設定したまま 0 を返すべきです。 そのため、例外を設定し得る別の API を呼び出す場合は、まず例外の状態を保存してクリアし、戻る前に復元する必要があります。

Added in version 3.12.