辞書オブジェクト (dictionary object)

PyDictObject

この PyObject のサブタイプは Python の辞書オブジェクトを表現します。

PyTypeObject PyDict_Type

この PyTypeObject のインスタンスは Python の辞書を表現します。このオブジェクトは、Python レイヤにおける dict と同じオブジェクトです。

int PyDict_Check(PyObject *p)

p が辞書オブジェクトか辞書型のサブタイプのインスタンスである場合に真を返します。この関数は常に成功します。

int PyDict_CheckExact(PyObject *p)

p が辞書オブジェクトだが辞書型のサブタイプのインスタンスでない場合に真を返します。この関数は常に成功します。

PyObject* PyDict_New()
Return value: New reference.

空の新たな辞書を返します。 失敗すると NULL を返します。

PyObject* PyDictProxy_New(PyObject *mapping)
Return value: New reference.

あるマップ型オブジェクトに対して、読み出し専用に制限された types.MappingProxyType オブジェクトを返します。通常、この関数は動的でないクラス型 (non-dynamic class type) のクラス辞書が変更されないようにビューを作成するために使われます。

void PyDict_Clear(PyObject *p)

現在辞書に入っている全てのキーと値のペアを除去して空にします。

int PyDict_Contains(PyObject *p, PyObject *key)

辞書 pkey が入っているか判定します。p の要素が key に一致した場合は 1 を返し、それ以外の場合には 0 を返します。エラーの場合 -1 を返します。この関数は Python の式 key in p と等価です。

PyObject* PyDict_Copy(PyObject *p)
Return value: New reference.

p と同じキーと値のペアが入った新たな辞書を返します。

int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val)

辞書 p に、 key をキーとして値 val を挿入します。 key はハッシュ可能(hashable)でなければなりません。ハッシュ可能でない場合、 TypeError を送出します。 成功した場合には 0 を、失敗した場合には -1 を返します。 この関数は val への参照を盗み取り ません

int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val)

Insert val into the dictionary p using key as a key. key should be a const char*. The key object is created using PyUnicode_FromString(key). Return 0 on success or -1 on failure. This function does not steal a reference to val.

int PyDict_DelItem(PyObject *p, PyObject *key)

Remove the entry in dictionary p with key key. key must be hashable; if it isn't, TypeError is raised. If key is not in the dictionary, KeyError is raised. Return 0 on success or -1 on failure.

int PyDict_DelItemString(PyObject *p, const char *key)

辞書 p から文字列 key をキーとするエントリを除去します。key が辞書になければ、KeyError を送出します。成功した場合には 0 を、失敗した場合には -1 を返します。

PyObject* PyDict_GetItem(PyObject *p, PyObject *key)
Return value: Borrowed reference.

辞書 p 内で key をキーとするオブジェクトを返します。 キー key が存在しない場合には NULL を返しますが、例外をセット しません

__hash__() メソッドや __eq__() メソッドの呼び出し中に起こる例外は抑制されることに注意してください。 エラーを報告させるには、代わりに PyDict_GetItemWithError() を使ってください。

PyObject* PyDict_GetItemWithError(PyObject *p, PyObject *key)
Return value: Borrowed reference.

PyDict_GetItem() の変種で例外を隠しません。 例外が発生した場合は、例外をセット した上で NULL を返します。 キーが存在しなかった場合は、例外をセット せずに NULL を返します。

PyObject* PyDict_GetItemString(PyObject *p, const char *key)
Return value: Borrowed reference.

This is the same as PyDict_GetItem(), but key is specified as a const char*, rather than a PyObject*.

__hash__() メソッドや __eq__() メソッドの呼び出し中や、一時的な文字列オブジェクトの作成中に起こる例外は抑制されることに注意してください。 エラーを報告させるには、代わりに PyDict_GetItemWithError() を使ってください。

PyObject* PyDict_SetDefault(PyObject *p, PyObject *key, PyObject *defaultobj)
Return value: Borrowed reference.

これは Python レベルの dict.setdefault() と同じです。 もしあれば、辞書 p から key に対応する値を返します。 キーが辞書になければ、値 defaultobj を挿入し defaultobj を返します。 この関数は、 key のハッシュ値を検索と挿入ごとに別々に評価するのではなく、一度だけしか評価しません。

バージョン 3.4 で追加.

PyObject* PyDict_Items(PyObject *p)
Return value: New reference.

辞書内の全ての要素対が入った PyListObject を返します。

PyObject* PyDict_Keys(PyObject *p)
Return value: New reference.

辞書内の全てのキーが入った PyListObject を返します。

PyObject* PyDict_Values(PyObject *p)
Return value: New reference.

辞書 p 内の全ての値が入った PyListObject を返します。

Py_ssize_t PyDict_Size(PyObject *p)

辞書内の要素の数を返します。辞書に対して len(p) を実行するのと同じです。

int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)

Iterate over all key-value pairs in the dictionary p. The Py_ssize_t referred to by ppos must be initialized to 0 prior to the first call to this function to start the iteration; the function returns true for each pair in the dictionary, and false once all pairs have been reported. The parameters pkey and pvalue should either point to PyObject* variables that will be filled in with each key and value, respectively, or may be NULL. Any references returned through them are borrowed. ppos should not be altered during iteration. Its value represents offsets within the internal dictionary structure, and since the structure is sparse, the offsets are not consecutive.

例えば:

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)

マップ型オブジェクト b の全ての要素にわたって、反復的にキー/値のペアを辞書 a に追加します。 b は辞書か、 PyMapping_Keys() または PyObject_GetItem() をサポートする何らかのオブジェクトにできます。 override が真ならば、 a のキーと一致するキーが b にある際に、既存のペアを置き換えます。それ以外の場合は、 b のキーに一致するキーが a にないときのみ追加を行います。成功した場合には 0 を返し、例外が送出された場合には -1 を返します。

int PyDict_Update(PyObject *a, PyObject *b)

C で表せば PyDict_Merge(a, b, 1) と同じで、また Python の a.update(b) と似ていますが、 PyDict_Update() は第二引数が "keys" 属性を持たない場合にキー/値ペアのシーケンスを反復することはありません。成功した場合には 0 を返し、例外が送出された場合には -1 を返します。

int PyDict_MergeFromSeq2(PyObject *a, PyObject *seq2, int override)

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