# シーケンス型プロトコル (sequence protocol)

int PySequence_Check(PyObject *o)
  次に属します: 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)
  次に属します: Stable ABI.

  成功するとシーケンス o 中のオブジェクトの数を返し、失敗すると `-1` を返します。これは、Python の式 `len(o)` と同じになります。

PyObject *PySequence_Concat(PyObject *o1, PyObject *o2)
  戻り値: 新しい参照。 次に属します: Stable ABI.

  成功すると o1 と o2 の連結 (concatenation) を返し、失敗すると `NULL` を返します。Python の式 `o1 + o2` と同じです。

PyObject *PySequence_Repeat(PyObject *o, Py_ssize_t count)
  戻り値: 新しい参照。 次に属します: Stable ABI.

  成功するとオブジェクト o の count 回繰り返しを返し、失敗すると `NULL` を返します。Python の式 `o * count` と同じです。

PyObject *PySequence_InPlaceConcat(PyObject *o1, PyObject *o2)
  戻り値: 新しい参照。 次に属します: Stable ABI.

  成功すると o1 と o2 の連結 (concatenation) を返し、失敗すると `NULL` を返します。o1 が in-place 演算をサポートする場合、in-place 演算を行います。Python の式 `o1 += o2` と同じです。

PyObject *PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
  戻り値: 新しい参照。 次に属します: Stable ABI.

  成功するとオブジェクト o の count 回繰り返しを返し、失敗すると `NULL` を返します。o が in-place 演算をサポートする場合、in-place 演算を行います。Python の式 `o *= count` と同じです。

PyObject *PySequence_GetItem(PyObject *o, Py_ssize_t i)
  戻り値: 新しい参照。 次に属します: Stable ABI.

  成功すると o の i 番目の要素を返し、失敗すると `NULL` を返します。Python の式 `o[i]` と同じです。

PyObject *PySequence_GetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
  戻り値: 新しい参照。 次に属します: Stable ABI.

  成功すると o の i1 から i2 までの間のスライスを返し、失敗すると `NULL` を返します。Python の式 `o[i1:i2]` と同じです。

int PySequence_SetItem(PyObject *o, Py_ssize_t i, PyObject *v)
  次に属します: Stable ABI.

  o の i 番目の要素に v を代入します。 失敗すると、例外を送出し `-1` を返します; 成功すると `0` を返します。 これは Python の文 `o[i] = v` と同じです。 この関数は v への参照を 盗み取りません 。

  v が `NULL` の場合はその要素が削除されますが、この機能は非推奨であり、 `PyObject_DelAttr()` を使うのが望ましいです。

int PySequence_DelItem(PyObject *o, Py_ssize_t i)
  次に属します: Stable ABI.

  o の i 番目の要素を削除します。失敗すると `-1` を返します。Python の文 `del o[i]` と同じです。

int PySequence_SetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2, PyObject *v)
  次に属します: Stable ABI.

  o の i1 から i2 までの間のスライスに v を代入します。Python の文 `o[i1:i2] = v` と同じです。

int PySequence_DelSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
  次に属します: Stable ABI.

  シーケンスオブジェクト o の i1 から i2 までの間のスライスを削除します。失敗すると `-1` を返します。Python の文 `del o[i1:i2]` と同じです。

Py_ssize_t PySequence_Count(PyObject *o, PyObject *value)
  次に属します: Stable ABI.

  o における value の出現回数、すなわち `o[key] == value` となる key の個数を返します。失敗すると `-1` を返します。Python の式 `o.count(value)` と同じです。

int PySequence_Contains(PyObject *o, PyObject *value)
  次に属します: Stable ABI.

  o に value が入っているか判定します。o のある要素が value と等価 (equal) ならば `1` を返し、それ以外の場合には `0` を返します。エラーが発生すると `-1` を返します。Python の式 `value in o` と同じです。

Py_ssize_t PySequence_Index(PyObject *o, PyObject *value)
  次に属します: Stable ABI.

  `o[i] == value` となる最初に見つかったインデクス i を返します。エラーが発生すると `-1` を返します。Python の式 `o.index(value)` と同じです。

PyObject *PySequence_List(PyObject *o)
  戻り値: 新しい参照。 次に属します: Stable ABI.

  シーケンスもしくはイテラブル o と同じ内容を持つリストオブジェクトを返します。 失敗したら `NULL` を返します。 返されるリストは新しく作られたことが保証されています。 これは Python の式 `list(o)` と同等です。

PyObject *PySequence_Tuple(PyObject *o)
  戻り値: 新しい参照。 次に属します: Stable ABI.

  シーケンスあるいはイテラブルである o と同じ内容を持つタプルオブジェクトを返します。 失敗したら `NULL` を返します。o がタプルの場合、新たな参照を返します。 それ以外の場合、適切な内容が入ったタプルを構築して返します。 Pythonの式 `tuple(o)` と同等です。

PyObject *PySequence_Fast(PyObject *o, const char *m)
  戻り値: 新しい参照。 次に属します: Stable ABI.

  シーケンスまたはイテラブルの o を `PySequence_Fast*` ファミリの関数で利用できるオブジェクトとして返します。オブジェクトがシーケンスでもイテラブルでもない場合は、メッセージ m を持つ、 `TypeError` を送出します。失敗したら `NULL` を返します。

  `PySequence_Fast*` ファミリの関数は、o が `PyTupleObject` または `PyListObject` と仮定し、o のデータフィールドに直接アクセスするため、そのように名付けられています。

  CPythonの実装では、もし o が 既にシーケンスかタプルであれば、o そのものを返します。

Py_ssize_t PySequence_Fast_GET_SIZE(PyObject *o)

  o が `NULL` でなく、 `PySequence_Fast()` が返したオブジェクトであると仮定して、 o の長さを返します。 o のサイズは `PySequence_Size()` を呼び出しても得られますが、 `PySequence_Fast_GET_SIZE()` の方が o をリストかタプルであると仮定して処理するため、より高速です。

PyObject *PySequence_Fast_GET_ITEM(PyObject *o, Py_ssize_t i)
  戻り値: 借用参照。

  o が `NULL` でなく、 `PySequence_Fast()` が返したオブジェクトであり、かつ i がインデクスの範囲内にあると仮定して、 o の i 番目の要素を返します。

PyObject **PySequence_Fast_ITEMS(PyObject *o)

  PyObject ポインタの背後にあるアレイを返します。この関数では、 o は `PySequence_Fast()` の返したオブジェクトであり、 `NULL` でないものと仮定しています。

  リストのサイズが変更されるとき、メモリ再確保が要素の配列を再配置するかもしれないことに注意してください。そのため、シーケンスの変更が発生しないコンテキストでのみ背後にあるポインタを使ってください。

PyObject *PySequence_ITEM(PyObject *o, Py_ssize_t i)
  戻り値: 新しい参照。

  o の i 番目の要素を返し、失敗すると `NULL` を返します。 `PySequence_GetItem()` の高速版であり、`PySequence_Check()` で o が真を返すかどうかの検証や、負の添え字の調整を行いません。