# 딕셔너리 객체

`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.

  Return a new empty dictionary, or `NULL` on failure.

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

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

void `PyDict_Clear`(PyObject *p)

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

int `PyDict_Contains`(PyObject *p, PyObject *key)

  딕셔너리 p에 key가 포함되어 있는지 확인합니다. 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)

  딕셔너리 p에 value를 key 키로 삽입합니다. key는 해시 가능해야 합니다. 그렇지 않으면 `TypeError`가 발생합니다. 성공하면 `0`을, 실패하면 `-1`을 반환합니다.

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

  key를 키로 사용하여 딕셔너리 p에 value를 삽입합니다. key는 `const char*`여야 합니다. 키 객체는 `PyUnicode_FromString(key)`를 사용하여 만듭니다. 성공하면 `0`을, 실패하면 `-1`을 반환합니다.

int `PyDict_DelItem`(PyObject *p, PyObject *key)

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

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

  딕셔너리 p에서 문자열 key로 지정된 키의 항목을 제거합니다. 성공하면 `0`을, 실패하면 `-1`을 반환합니다.

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

  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.

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

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

  Variant of `PyDict_GetItem()` that does not suppress exceptions. Return `NULL` with an exception set if an exception occurred. Return `NULL` without an exception set if the key wasn’t present.

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

  이것은 `PyDict_GetItem()`와 같지만, key가 `PyObject*`가 아닌 `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)

  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에서 일치하는 키가 있으면 교체되고, 그렇지 않으면 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

int `PyDict_ClearFreeList`()

  자유 목록(free list)을 비웁니다. 해제된 항목의 총수를 반환합니다.

  버전 3.3에 추가.