辞書オブジェクト (dictionary object)¶
-
PyTypeObject PyDict_Type¶
- 次に属します: Stable ABI.
この
PyTypeObject
のインスタンスは Python の辞書を表現します。このオブジェクトは、Python レイヤにおけるdict
と同じオブジェクトです。
-
PyObject *PyDict_New()¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
空の新たな辞書を返します。 失敗すると
NULL
を返します。
-
PyObject *PyDictProxy_New(PyObject *mapping)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
あるマップ型オブジェクトに対して、読み出し専用に制限された
types.MappingProxyType
オブジェクトを返します。通常、この関数は動的でないクラス型 (non-dynamic class type) のクラス辞書が変更されないようにビューを作成するために使われます。
-
void PyDict_Clear(PyObject *p)¶
- 次に属します: Stable ABI.
現在辞書に入っている全てのキーと値のペアを除去して空にします。
-
int PyDict_Contains(PyObject *p, PyObject *key)¶
- 次に属します: Stable ABI.
辞書 p に key が入っているか判定します。p の要素が key に一致した場合は
1
を返し、それ以外の場合には0
を返します。エラーの場合-1
を返します。この関数は Python の式key in p
と等価です。
-
PyObject *PyDict_Copy(PyObject *p)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
p と同じキーと値のペアが入った新たな辞書を返します。
-
int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val)¶
- 次に属します: Stable ABI.
辞書 p に、 key をキーとして値 val を挿入します。 key はハッシュ可能(hashable)でなければなりません。ハッシュ可能でない場合、
TypeError
を送出します。 成功した場合には0
を、失敗した場合には-1
を返します。 この関数は val への参照を盗み取り ません。
-
int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val)¶
- 次に属します: Stable ABI.
This is the same as
PyDict_SetItem()
, but key is specified as a const char* UTF-8 encoded bytes string, rather than a PyObject*.
-
int PyDict_DelItem(PyObject *p, PyObject *key)¶
- 次に属します: Stable ABI.
辞書 p から key をキーとするエントリを除去します。 key は ハッシュ可能 でなければなりません; ハッシュ可能でない場合、
TypeError
を送出します。key が辞書になければ、KeyError
を送出します。成功した場合には0
を、失敗した場合には-1
を返します。
-
int PyDict_DelItemString(PyObject *p, const char *key)¶
- 次に属します: Stable ABI.
This is the same as
PyDict_DelItem()
, but key is specified as a const char* UTF-8 encoded bytes string, rather than a PyObject*.
-
PyObject *PyDict_GetItem(PyObject *p, PyObject *key)¶
- 戻り値: 借用参照。 次に属します: Stable ABI.
Return the object from dictionary p which has a key key. Return
NULL
if the key key is not present, but without setting an exception.注釈
Exceptions that occur while this calls
__hash__()
and__eq__()
methods are silently ignored. Prefer thePyDict_GetItemWithError()
function instead.バージョン 3.10 で変更: Calling this API without GIL held had been allowed for historical reason. It is no longer allowed.
-
PyObject *PyDict_GetItemWithError(PyObject *p, PyObject *key)¶
- 戻り値: 借用参照。 次に属します: Stable ABI.
PyDict_GetItem()
の変種で例外を隠しません。 例外が発生した場合は、例外をセット した上でNULL
を返します。 キーが存在しなかった場合は、例外をセット せずにNULL
を返します。
-
PyObject *PyDict_GetItemString(PyObject *p, const char *key)¶
- 戻り値: 借用参照。 次に属します: Stable ABI.
This is the same as
PyDict_GetItem()
, but key is specified as a const char* UTF-8 encoded bytes string, rather than a PyObject*.注釈
Exceptions that occur while this calls
__hash__()
and__eq__()
methods or while creating the temporarystr
object are silently ignored. Prefer using thePyDict_GetItemWithError()
function with your ownPyUnicode_FromString()
key instead.
-
PyObject *PyDict_SetDefault(PyObject *p, PyObject *key, PyObject *defaultobj)¶
- 戻り値: 借用参照。
これは Python レベルの
dict.setdefault()
と同じです。 もしあれば、辞書 p から key に対応する値を返します。 キーが辞書になければ、値 defaultobj を挿入し defaultobj を返します。 この関数は、 key のハッシュ値を検索と挿入ごとに別々に評価するのではなく、一度だけしか評価しません。バージョン 3.4 で追加.
-
PyObject *PyDict_Items(PyObject *p)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
辞書内の全ての要素対が入った
PyListObject
を返します。
-
PyObject *PyDict_Keys(PyObject *p)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
辞書内の全てのキーが入った
PyListObject
を返します。
-
PyObject *PyDict_Values(PyObject *p)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
辞書 p 内の全ての値が入った
PyListObject
を返します。
-
Py_ssize_t PyDict_Size(PyObject *p)¶
- 次に属します: Stable ABI.
辞書内の要素の数を返します。辞書に対して
len(p)
を実行するのと同じです。
-
int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)¶
- 次に属します: Stable ABI.
辞書 p 内の全てのキー/値のペアにわたる反復処理を行います。 ppos が参照している
Py_ssize_t
型は、この関数で反復処理を開始する際に、最初に関数を呼び出すよりも前に0
に初期化しておかなければなりません。この関数は辞書内の各ペアを取り上げるごとに真を返し、全てのペアを取り上げたことが分かると偽を返します。 パラメーター pkey および pvalue には、それぞれ辞書の各々のキーと値が埋められた PyObject* 変数を指すポインタか、またはNULL
が入ります。 この関数から返される参照はすべて借用参照になります。 反復処理中に ppos を変更してはなりません。 この値は内部的な辞書構造体のオフセットを表現しており、構造体はスパースなので、オフセットの値に一貫性がないためです。例えば:
PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(self->dict, &pos, &key, &value)) { /* do something interesting with the values... */ ... }
反復処理中に辞書 p を変更してはなりません。辞書を反復処理する際に、キーに対応する値を変更しても大丈夫になりましたが、キーの集合を変更しないことが前提です。以下に例を示します:
PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(self->dict, &pos, &key, &value)) { long i = PyLong_AsLong(value); if (i == -1 && PyErr_Occurred()) { return -1; } PyObject *o = PyLong_FromLong(i + 1); if (o == NULL) return -1; if (PyDict_SetItem(self->dict, key, o) < 0) { Py_DECREF(o); return -1; } Py_DECREF(o); }
-
int PyDict_Merge(PyObject *a, PyObject *b, int override)¶
- 次に属します: Stable ABI.
マップ型オブジェクト b の全ての要素にわたって、反復的にキー/値のペアを辞書 a に追加します。 b は辞書か、
PyMapping_Keys()
またはPyObject_GetItem()
をサポートする何らかのオブジェクトにできます。 override が真ならば、 a のキーと一致するキーが b にある際に、既存のペアを置き換えます。それ以外の場合は、 b のキーに一致するキーが a にないときのみ追加を行います。成功した場合には0
を返し、例外が送出された場合には-1
を返します。
-
int PyDict_Update(PyObject *a, PyObject *b)¶
- 次に属します: Stable ABI.
C で表せば
PyDict_Merge(a, b, 1)
と同じで、また Python のa.update(b)
と似ていますが、PyDict_Update()
は第二引数が "keys" 属性を持たない場合にキー/値ペアのシーケンスを反復することはありません。成功した場合には0
を返し、例外が送出された場合には-1
を返します。
-
int PyDict_MergeFromSeq2(PyObject *a, PyObject *seq2, int override)¶
- 次に属します: Stable ABI.
seq2 内のキー/値ペアを使って、辞書 a の内容を更新したり統合したりします。seq2 は、キー/値のペアとみなせる長さ 2 の反復可能オブジェクト(iterable object) を生成する反復可能オブジェクトでなければなりません。重複するキーが存在する場合、override が真ならば先に出現したキーを使い、そうでない場合は後に出現したキーを使います。成功した場合には
0
を返し、例外が送出された場合には-1
を返します。(戻り値以外は) 等価な Python コードを書くと、以下のようになります:def PyDict_MergeFromSeq2(a, seq2, override): for key, value in seq2: if override or key not in a: a[key] = value