# 시퀀스 프로토콜

int `PySequence_Check`(PyObject *o)
  Part of the Stable ABI.

  Return `1` if the object provides the sequence protocol, and `0` otherwise. Note that it returns `1` for Python classes with a `__getitem__()` method, unless they are `dict` subclasses, since in general it is impossible to determine what type of keys the class supports. This function always succeeds.

Py_ssize_t `PySequence_Size`(PyObject *o)
Py_ssize_t `PySequence_Length`(PyObject *o)
  Part of the Stable ABI.

  성공 시 시퀀스 o의 객체 수를 반환하고, 실패하면 `-1`을 반환합니다. 이것은 파이썬 표현식 `len(o)`와 동등합니다.

PyObject *`PySequence_Concat`(PyObject *o1, PyObject *o2)
  반환값: 새 참조. Part of the Stable ABI.

  성공 시 o1와 o2의 이어붙이기를 반환하고, 실패하면 `NULL`을 반환합니다. 이것은 파이썬 표현식 `o1 + o2`와 동등합니다.

PyObject *`PySequence_Repeat`(PyObject *o, Py_ssize_t count)
  반환값: 새 참조. Part of the Stable ABI.

  시퀸스 객체 o를 count 번 반복한 결과를 반환하거나, 실패 시 `NULL`을 반환합니다. 이것은 파이썬 표현식 `o * count`와 동등합니다.

PyObject *`PySequence_InPlaceConcat`(PyObject *o1, PyObject *o2)
  반환값: 새 참조. Part of the Stable ABI.

  성공 시 o1와 o2의 이어붙이기를 반환하고, 실패하면 `NULL`을 반환합니다. 이 연산은 o1가 지원하면 제자리에서(in-place) 수행됩니다. 이것은 파이썬 표현식 `o1 += o2`와 동등합니다.

PyObject *`PySequence_InPlaceRepeat`(PyObject *o, Py_ssize_t count)
  반환값: 새 참조. Part of the Stable ABI.

  시퀸스 객체 o를 count 번 반복한 결과를 반환하거나, 실패 시 `NULL`을 반환합니다. 이 연산은 o가 지원하면 제자리에서(in-place) 수행됩니다. 이것은 파이썬 표현식 `o *= count`와 동등합니다.

PyObject *`PySequence_GetItem`(PyObject *o, Py_ssize_t i)
  반환값: 새 참조. Part of the Stable ABI.

  o의 i 번째 요소를 반환하거나, 실패하면 `NULL`을 반환합니다. 이것은 파이썬 표현식 `o[i]`와 동등합니다.

PyObject *`PySequence_GetSlice`(PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
  반환값: 새 참조. Part of the Stable ABI.

  시퀀스 객체 o의 i1와 i2 사이의 슬라이스를 반환하거나, 실패하면 `NULL`을 반환합니다. 이것은 파이썬 표현식 `o[i1:i2]`와 동등합니다.

int `PySequence_SetItem`(PyObject *o, Py_ssize_t i, PyObject *v)
  Part of the Stable ABI.

  객체 v를 o의 i 번째 요소에 대입합니다. 실패하면 예외를 발생시키고 `-1`을 반환합니다; 성공하면 `0`을 반환합니다. 이것은 파이썬 문장 `o[i] = v`와 동등합니다. 이 함수는 v에 대한 참조를 훔치지 않습니다.

  v가 `NULL`이면, 요소가 삭제되지만, 이 기능은 `PySequence_DelItem()` 사용을 위해 폐지되었습니다.

int `PySequence_DelItem`(PyObject *o, Py_ssize_t i)
  Part of the Stable ABI.

  o 객체의 i 번째 요소를 삭제합니다. 실패하면 `-1`을 반환합니다. 이것은 파이썬 문장 `del o[i]`와 동등합니다.

int `PySequence_SetSlice`(PyObject *o, Py_ssize_t i1, Py_ssize_t i2, PyObject *v)
  Part of the Stable ABI.

  시퀀스 객체 v를 시퀀스 객체 o의 i1에서 i2 사이의 슬라이스에 대입합니다. 이것은 파이썬 문장 `o[i1:i2] = v`와 동등합니다.

int `PySequence_DelSlice`(PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
  Part of the Stable ABI.

  시퀀스 객체 o의 i1에서 i2 사이의 슬라이스를 삭제합니다. 실패하면 `-1`을 반환합니다. 이것은 파이썬 문장 `del o[i1:i2]`와 동등합니다.

Py_ssize_t `PySequence_Count`(PyObject *o, PyObject *value)
  Part of the Stable ABI.

  o에 있는 value의 수를 반환합니다. 즉, `o[key] == value`를 만족하는 key의 수를 반환합니다. 실패하면 `-1`을 반환합니다. 이것은 파이썬 표현식 `o.count(value)`와 동등합니다.

int `PySequence_Contains`(PyObject *o, PyObject *value)
  Part of the Stable ABI.

  o에 value가 있는지 확인합니다. o의 항목 중 하나가 value와 같으면 `1`을 반환하고, 그렇지 않으면 `0`을 반환합니다. 에러 시 `-1`을 반환합니다. 이는 파이썬 표현식 `value in o`와 동등합니다.

Py_ssize_t `PySequence_Index`(PyObject *o, PyObject *value)
  Part of the Stable ABI.

  `o[i] == value`을 만족하는 첫 번째 인덱스 i를 반환합니다. 에러 시 `-1`을 반환합니다. 이것은 파이썬 표현식 `o.index(value)`와 동등합니다.

PyObject *`PySequence_List`(PyObject *o)
  반환값: 새 참조. Part of the Stable ABI.

  시퀀스나 이터러블 o와 같은 내용을 가진 리스트 객체를 반환하거나, 실패하면 `NULL`을 반환합니다. 반환된 리스트는 새로운 것으로 보장됩니다. 이것은 파이썬 표현식 `list(o)`와 동등합니다.

PyObject *`PySequence_Tuple`(PyObject *o)
  반환값: 새 참조. Part of the Stable ABI.

  시퀀스나 이터러블 o와 같은 내용을 가진 튜플 객체를 반환하거나, 실패하면 `NULL`을 반환합니다. o가 튜플이면, 새로운 참조가 반환되고, 그렇지 않으면 튜플이 적절한 내용으로 만들어집니다. 이것은 파이썬 표현식 `tuple(o)`와 동등합니다.

PyObject *`PySequence_Fast`(PyObject *o, const char *m)
  반환값: 새 참조. Part of the Stable ABI.

  시퀀스나 이터러블 o를 다른 `PySequence_Fast*` 계열 함수에서 사용할 수 있는 객체로 반환합니다. 객체가 시퀀스나 이터러블이 아니면 m을 메시지 텍스트로 사용하여 `TypeError`를 발생시킵니다. 실패 시 `NULL`을 반환합니다.

  `PySequence_Fast*` 함수는 o가 `PyTupleObject`나 `PyListObject`라고 가정하고 o의 데이터 필드에 직접 액세스하기 때문에 이렇게 이름 붙였습니다.

  CPython 구현 세부 사항으로, o가 이미 시퀀스나 리스트면, 반환됩니다.

Py_ssize_t `PySequence_Fast_GET_SIZE`(PyObject *o)

  o의 길이를 반환하는데, o가 `PySequence_Fast()`에 의해 반환되었고, o가 `NULL`이 아니라고 가정합니다. 크기는 o에 대해 `PySequence_Size()`를 호출하여 얻을 수도 있지만, `PySequence_Fast_GET_SIZE()`는 o가 리스트나 튜플이라고 가정할 수 있으므로 더 빠릅니다.

PyObject *`PySequence_Fast_GET_ITEM`(PyObject *o, Py_ssize_t i)
  반환값: 빌린 참조.

  o의 i 번째 요소를 반환하는데, o가 `PySequence_Fast()`에 의해 반환되었고, o가 `NULL`이 아니며, i가 경계 내에 있다고 가정합니다.

PyObject **`PySequence_Fast_ITEMS`(PyObject *o)

  PyObject 포인터의 하부 배열을 반환합니다. o가 `PySequence_Fast()`에 의해 반환되었고, o가 `NULL`이 아니라고 가정합니다.

  리스트의 크기가 변경되면, 재할당이 항목 배열을 재배치할 수 있음에 유의하십시오. 따라서, 시퀀스가 변경될 수 없는 문맥에서만 하부 배열 포인터를 사용하십시오.

PyObject *`PySequence_ITEM`(PyObject *o, Py_ssize_t i)
  반환값: 새 참조.

  o의 i 번째 요소를 반환하거나, 실패하면 `NULL`을 반환합니다. `PySequence_GetItem()`의 빠른 형식이지만, o에 대해 `PySequence_Check()`가 참인지 검사하지 않고, 음수 인덱스를 조정하지 않습니다.