딕셔너리 객체

PyDictObject

PyObject의 서브 형은 파이썬 딕셔너리 객체를 나타냅니다.

PyTypeObject PyDict_Type

PyTypeObject 인스턴스는 파이썬 딕셔너리 형을 나타냅니다. 이것은 파이썬 계층의 dict와 같은 객체입니다.

int PyDict_Check(PyObject *p)

p가 dict 객체이거나 dict 형의 서브 형의 인스턴스면 참을 반환합니다. 이 함수는 항상 성공합니다.

int PyDict_CheckExact(PyObject *p)

p가 dict 객체이지만, dict 형의 서브 형의 인스턴스는 아니면 참을 반환합니다. 이 함수는 항상 성공합니다.

PyObject* PyDict_New()
Return value: New reference.

새로운 빈 딕셔너리를 반환하거나, 실패하면 NULL을 반환합니다.

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

읽기 전용 동작을 강제하는 매핑을 위한 types.MappingProxyType 객체를 반환합니다. 이것은 일반적으로 비 동적 클래스 형을 위한 딕셔너리의 수정을 방지하기 위해 뷰를 만드는 데 사용됩니다.

void PyDict_Clear(PyObject *p)

기존 딕셔너리의 모든 키-값 쌍을 비웁니다.

int PyDict_Contains(PyObject *p, PyObject *key)

딕셔너리 pkey가 포함되어 있는지 확인합니다. p의 항목이 key와 일치하면 1을 반환하고, 그렇지 않으면 0을 반환합니다. 에러면 -1을 반환합니다. 이는 파이썬 표현식 key in p와 동등합니다.

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

p와 같은 키-값 쌍을 포함하는 새 딕셔너리를 반환합니다.

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

딕셔너리 pvalkey 키로 삽입합니다. key해시 가능해야 합니다. 그렇지 않으면 TypeError가 발생합니다. 성공하면 0을, 실패하면 -1을 반환합니다. 이 함수는 val에 대한 참조를 훔치지 않습니다.

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

key를 키로 사용하여 딕셔너리 pval을 삽입합니다. keyconst char*여야 합니다. 키 객체는 PyUnicode_FromString(key)를 사용하여 만듭니다. 성공하면 0을, 실패하면 -1을 반환합니다. 이 함수는 val에 대한 참조를 훔치지 않습니다.

int PyDict_DelItem(PyObject *p, PyObject *key)

딕셔너리 p에서 키가 key인 항목을 제거합니다. key는 해시 가능해야 합니다. 그렇지 않으면 TypeError가 발생합니다. key가 딕셔너리에 없으면, KeyError가 발생합니다. 성공하면 0을, 실패하면 -1을 반환합니다.

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.

이것은 PyDict_GetItem()와 같지만, keyPyObject*가 아닌 const char*로 지정됩니다.

__hash__()__eq__() 메서드를 호출하고 임시 문자열 객체를 만드는 동안 발생하는 예외는 억제됩니다. 에러 보고를 얻으려면 대신 PyDict_GetItemWithError()를 사용하십시오.

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

이것은 파이썬 수준의 dict.setdefault()와 같습니다. 존재하면, 딕셔너리 p에서 key에 해당하는 값을 반환합니다. 키가 dict에 없으면, 값 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)

딕셔너리 p의 모든 키-값 쌍을 이터레이트 합니다. ppos에 의해 참조된 Py_ssize_t는, 이터레이션을 시작하기 위해 이 함수를 처음 호출하기 전에 0으로 초기화되어야 합니다; 이 함수는 딕셔너리의 각 쌍에 대해 참을 반환하고, 모든 쌍이 보고되었으면 거짓을 반환합니다. 매개 변수 pkeypvalue는 각각 키와 값으로 채울 PyObject* 변수를 가리 키거나, NULL 일 수 있습니다. 이들을 통해 반환된 참조는 모두 빌린(borrowed) 것입니다. 이터레이션 중에 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)

매핑 객체 b를 이터레이트 하면서, 키-값 쌍을 딕셔너리 a에 추가합니다. b는 딕셔너리거나 PyMapping_Keys()PyObject_GetItem()를 지원하는 모든 객체일 수 있습니다. override가 참이면, a에 있는 기존 쌍이 b에서 일치하는 키가 있으면 교체되고, 그렇지 않으면 a와 일치하는 키가 없을 때만 쌍이 추가됩니다. 성공하면 0을 반환하고, 예외가 발생하면 -1을 반환합니다.

int PyDict_Update(PyObject *a, PyObject *b)

이는 C에서 PyDict_Merge(a, b, 1)와 같고, 두 번째 인자에 “keys” 어트리뷰트가 없을 때 PyDict_Update()가 키-값 쌍의 시퀀스에 대해 이터레이트 하지 않는다는 점만 제외하면, 파이썬에서 a.update(b)와 유사합니다. 성공하면 0을 반환하고, 예외가 발생하면 -1을 반환합니다.

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

seq2의 키-값 쌍으로 딕셔너리 a를 갱신하거나 병합합니다. seq2는 키-값 쌍으로 간주하는 길이 2의 이터러블 객체를 생성하는 이터러블 객체여야 합니다. 중복 키가 있으면, override가 참이면 마지막이 승리하고, 그렇지 않으면 첫 번째가 승리합니다. 성공 시 0을 반환하고, 예외가 발생하면 -1을 반환합니다. 동등한 파이썬은 이렇습니다(반환 값 제외)

def PyDict_MergeFromSeq2(a, seq2, override):
    for key, value in seq2:
        if override or key not in a:
            a[key] = value