#
6.1 オブジェクトプロトコル (object protocol)

int `PyObject_Print`( | PyObject *o, FILE *fp, int flags)

  オブジェクト o をファイル fp に出力します。 失敗すると`-1` を返します。 flags 引数は何らかの出力オプションを有効にする際に使います。 現在サポートされている唯一のオプションは`Py_PRINT_RAW` です; このオプションを指定すると、`repr()` の代わりに `str()` を使ってオブジェクトを書き込みます。

int `PyObject_HasAttrString`( | PyObject *o, char *attr_name)

  o が属性 attr_name を持つときに `1` を、それ以外の ときに `0` を返します。この関数は Python の式 "`hasattr(o, attr_name)`" と同じです。 この関数は常に成功します。

PyObject* `PyObject_GetAttrString`( | PyObject *o, char *attr_name)

  戻り値: 新たな参照.
  オブジェクト o から、名前 attr_name の属性を取得します。 成功すると属性値を返し失敗すると `NULL` を返します。 この関数は Python の式 "`o.attr_name`"と同じです。

int `PyObject_HasAttr`( | PyObject *o, PyObject *attr_name)

  o が属性 attr_name を持つときに `1` を、それ以外の ときに `0` を返します。この関数は Python の式 "`hasattr(o, attr_name)`" と同じです。 この関数は常に成功します。

PyObject* `PyObject_GetAttr`( | PyObject *o, PyObject *attr_name)

  戻り値: 新たな参照.
  オブジェクト o から、名前 attr_name の属性を取得します。 成功すると属性値を返し失敗すると `NULL` を返します。 この関数は Python の式 "`o.attr_name`"と同じです。

int `PyObject_SetAttrString`( | PyObject *o, char *attr_name, PyObject *v)

  オブジェクト o のattr_name という名の属性に、値 v を設定します。失敗すると `-1` を返します。 この関数は Python の式 "`o.attr_name = v`"と同じです。

int `PyObject_SetAttr`( | PyObject *o, PyObject *attr_name, PyObject *v)

  オブジェクト o のattr_name という名の属性に、値 v を設定します。失敗すると `-1` を返します。 この関数は Python の式 "`o.attr_name = v`"と同じです。

int `PyObject_DelAttrString`( | PyObject *o, char *attr_name)

  オブジェクト o のattr_name という名の属性を削除します。 失敗すると `-1` を返します。 この関数は Python の文 "`del o.attr_name`"と同じです。

int `PyObject_DelAttr`( | PyObject *o, PyObject *attr_name)

  オブジェクト o のattr_name という名の属性を削除します。 失敗すると `-1` を返します。 この関数は Python の文 "`del o.attr_name`"と同じです。

PyObject* `PyObject_RichCompare`( | PyObject *o1, PyObject *o2, int opid)

  戻り値: 新たな参照.
  o1 と o2 を opid に指定した演算によって比較します。 opid は `Py_LT`, `Py_LE`, `Py_EQ`, `Py_NE`, `Py_GT`, または `Py_GE`, のいずれかでなければならず、それぞれ `<`, `<=`, `==`, `!=`, `>`, および `>=` に対応します。 この関数は Python の式 "`o1 op o2`" と同じで、 `op` が opid に対応する演算子です。 成功すると比較結果の値を返し失敗すると `NULL` を返します。

int `PyObject_RichCompareBool`( | PyObject *o1, PyObject *o2, int opid)

  o1 と o2 を opid に指定した演算によって比較します。 opid は `Py_LT`, `Py_LE`, `Py_EQ`, `Py_NE`, `Py_GT`, または `Py_GE`, のいずれかでなければならず、それぞれ `<`, `<=`, `==`, `!=`, `>`, および `>=` に対応します。 比較結果が真ならば `1` を、偽ならば `0` を、 エラーが発生すると `-1` を返します。 この関数は Python の式 "`o1 op o2`" と同じで、 `op` が opid に対応する演算子です。

int `PyObject_Cmp`( | PyObject *o1, PyObject *o2, int *result)

  o1 と o2 の値を比較します。このときo1 が比較ルーチンを 持っていればそれを使い、なければ o2 のルーチンを使います。 比較結果は result に返されます。失敗すると `-1` を返します。 Python 文 "`result = cmp(o1, o2)`"と同じです。

int `PyObject_Compare`( | PyObject *o1, PyObject *o2)

  o1 と o2 の値を比較します。このときo1 が比較ルーチンを 持っていればそれを使い、なければ o2 のルーチンを使います。 比較結果は result に返されます。失敗すると `-1` を返します。 Python 文 "`result = cmp(o1, o2)`"と同じです。成功すると比較結果を返します。エラーが生じた場合の 戻り値は未定義です; `PyErr_Occurred()` を使ってエラー検出を 行って下さい。Python 式 "`cmp(o1, o2)`"と同じです。

PyObject* `PyObject_Repr`( | PyObject *o)

  戻り値: 新たな参照.
  o の文字列表現を計算します。成功すると文字列表現を返し、 失敗すると `NULL` を返します。Python 式"`repr(o)`"と同じです。この関数は組み込み関数 `repr()` や逆クオート表記の処理で 呼び出されます。

PyObject* `PyObject_Str`( | PyObject *o)

  戻り値: 新たな参照.
  o の文字列表現を計算します。成功すると文字列表現を返し、 失敗すると `NULL` を返します。Python 式"`str(o)`"と同じです。この関数は組み込み関数 `str()` や`print` 文の処理で 呼び出されます。

PyObject* `PyObject_Unicode`( | PyObject *o)

  戻り値: 新たな参照.
  o の Unicode 文字列表現を計算します。成功すると Unicode 文字列表現を返し失敗すると `NULL` を返します。 Python 式"`unicode(o)`" と同じです。この関数は組み込み関数 `unicode()` の処理で呼び出されます。

int `PyObject_IsInstance`( | PyObject *inst, PyObject *cls)

  inst が cls のインスタンスか、 cls のサブクラスの インスタンスの場合に `-1` を返し、そうでなければ `0` を 返します。エラーの時には `-1` を返し、例外をセットします。 cls がクラスオブジェクトではなく型オブジェクトの場合、 `PyObject_IsInstance()` は inst がcls で あるときに `1` を返します。cls をタプルで指定した場合、 cls に指定した全てのエントリについてチェックを行います。 少なくとも一つのエントリに対するチェックが `1` を返せば結果は `1` になり、そうでなければ `0` になります。 inst がクラスインスタンスでなく、かつ cls が 型オブジェクトでもクラスオブジェクトでもタプルでもない場合、 inst には `__class__` 属性がなくてはなりません -- この場合、`__class__` 属性の値と、cls の値の間の クラス関係を、関数の戻り値を決定するのに使います。 バージョン2.1 以降で新規追加された 仕様です。 バージョン2.2 以降で変更された 仕様: 二つ目の引数にタプルのサポートを追加しました。

サブクラスの決定はかなり正攻法で行いますが、クラスシステムの拡張を 実装する人たちに知っておいて欲しいちょっとした問題点があります。 `A` と `B` がクラスオブジェクトの場合、 `B` が `A` のサブクラスとなるのは、`B` が `A` を 直接的あるいは間接的に継承 (inherit) している場合です。 両方がクラスオブジェクトでない場合、二つのオブジェクト間の クラス関係を決めるには、より汎用の機構を使います。 B が A のサブクラスであるか調べたとき、A が B と等しければ、`PyObject_IsSubclass()` は真を返します。 A および B が異なるオブジェクトなら、B の `__bases__` 属性から深さ優先探索 (depth-first search)で A を探索します -- オブジェクトに`__bases__` があるだけで、 この決定法を適用する条件を満たしているとみなされます。

int `PyObject_IsSubclass`( | PyObject *derived, PyObject *cls)

  クラス derived が cls と同じクラスか、cls の導出 クラスの場合に `1` を返し、それ以外の場合には `0` を 返します。エラーが生じると `-1` を返します。 cls をタプルで指定した場合、cls に指定した全てのエントリに ついてチェックを行います。 少なくとも一つのエントリに対するチェックが `1` を返せば結果は `1` になり、そうでなければ `0` になります。 derived または cls のいずれかが実際のクラスオブジェクト (あるいはタプル) でない場合、上で述べた汎用アルゴリズムを使います。 バージョン2.1 以降で新規追加された 仕様です。 バージョン2.3 以降で変更された 仕様: 以前の Python のバージョンは、二つ目の引数に タプルをサポートしていませんでした

int `PyCallable_Check`( | PyObject *o)

  オブジェクト o が呼び出し可能オブジェクトかどうか調べます。 オブジェクトが呼び出し可能であるときに `1` を返し、 そうでないときには `0` を返します。 この関数呼び出しは常に成功します。

PyObject* `PyObject_Call`( | PyObject *callable_object, PyObject *args, PyObject *kw)

  呼び出し可能な Python オブジェクト callable_object を タプルで指定された引数 args および辞書で指定された名前つき 引数 (named argument) kw とともに呼び出します。名前つき引数を 必要としない場合、 kw を `NULL` にしてもかまいません。 args は `NULL` であってはなりません。引数が全く必要ない場合には 空のタプルを使ってください。 成功すると呼び出し結果として得られたオブジェクトを返し、 失敗すると `NULL` を返します。 Python の式 "`apply(callable_object, args, kw)`"あるいは "`callable_object(*args, **kw)`" と同じです。 バージョン2.2 以降で新規追加された 仕様です。

PyObject* `PyObject_CallObject`( | PyObject *callable_object, PyObject *args)

  戻り値: 新たな参照.
  呼び出し可能な Python オブジェクト callable_object を タプルで指定された引数 args とともに呼び出します。 引数を 必要としない場合、 args を `NULL` にしてもかまいません。 成功すると呼び出し結果として得られたオブジェクトを返し、 失敗すると `NULL` を返します。 Python の式 "`apply(callable_object, args)`" あるいは "`callable_object(*args)`" と同じです。

PyObject* `PyObject_CallFunction`( | PyObject *callable, char *format, ...)

  戻り値: 新たな参照.
  呼び出し可能な Python オブジェクト callable_object を 可変数個の C 引数とともに呼び出します。C 引数は `Py_BuildValue()` 形式のフォーマット文字列を使って記述します。 format は`NULL`にしてもよく、与える引数がないことを表します。 成功すると呼び出し結果として得られたオブジェクトを返し、 失敗すると `NULL` を返します。 Python の式 "`apply(callable, args)`" あるいは "`callable(*args)`" と同じです。

PyObject* `PyObject_CallMethod`( | PyObject *o, char *method, char *format, ...)

  戻り値: 新たな参照.
  オブジェクト o の method という名前のメソッドを、 可変数個の C 引数とともに呼び出します。C 引数は `Py_BuildValue()` 形式のフォーマット文字列を使って記述します。 format は`NULL`にしてもよく、与える引数がないことを表します。 成功すると呼び出し結果として得られたオブジェクトを返し、 失敗すると `NULL` を返します。 Python の式 "`o.method(args)`" と同じです。

PyObject* `PyObject_CallFunctionObjArgs`( | PyObject *callable, ..., `NULL`)

  戻り値: 新たな参照.

  呼び出し可能な Python オブジェクト callable_object を 可変数個の `PyObject*` 引数とともに呼び出します。 引数列は末尾に `NULL`がついた可変数個のパラメタとして与えます。 成功すると呼び出し結果として得られたオブジェクトを返し 失敗すると `NULL` を返します。 バージョン2.2 以降で新規追加された 仕様です。

PyObject* `PyObject_CallMethodObjArgs`( | PyObject *o, PyObject *name, ..., `NULL`)

  戻り値: 新たな参照.
  オブジェクト o のメソッドを呼び出します、メソッド名は Python 文字列オブジェクトname で与えます。可変数個の `PyObject*` 引数と共に呼び出されます. 引数列は末尾に `NULL`がついた可変数個のパラメタとして与えます。 成功すると呼び出し結果として得られたオブジェクトを返し 失敗すると `NULL` を返します。 バージョン2.2 以降で新規追加された 仕様です。

int `PyObject_Hash`( | PyObject *o)

  オブジェクト o のハッシュ値を計算して返します。 失敗すると `-1` を返します。 Python の式 "`hash(o)`" と同じです。

int `PyObject_IsTrue`( | PyObject *o)

  o が真を表すとみなせる場合には `1` を、 そうでないときには `0` を返します。 Python の式 "`not not o`" と同じです。 失敗すると `-1` を返します。

int `PyObject_Not`( | PyObject *o)

  o が真を表すとみなせる場合には `0` を、 そうでないときには `1` を返します。 Python の式 "`not o`" と同じです。 失敗すると `-1` を返します。

PyObject* `PyObject_Type`( | PyObject *o)

  戻り値: 新たな参照.
  o が `NULL`でない場合、オブジェクトo のオブジェクト型に 相当する型オブジェクトを返します。失敗すると `SystemError` を送出して `NULL`を返します。 Python の式 `type(o)`と同じです。 この関数は戻り値の参照カウントをインクリメントします。 参照カウントのインクリメントが必要でない限り、広く使われていて `PyTypeObject*` 型のポインタを返す表記法 `o->ob_type` の代わりに使う理由は全くありません。

int `PyObject_TypeCheck`( | PyObject *o, PyTypeObject *type)

  オブジェクト o が、 type か type のサブタイプで あるときに真を返します。どちらのパラメタも `NULL`であってはなりません。 バージョン2.2 以降で新規追加された 仕様です。

int `PyObject_Length`( | PyObject *o)

int `PyObject_Size`( | PyObject *o)

  o の長さを返します。オブジェクトo が配列プロトコルと マップ型プロトコルの両方を提供している場合、配列としての長さを 返します。エラーが生じると `-1` を返します。 Python の式 "`len(o)`"と同じです。

PyObject* `PyObject_GetItem`( | PyObject *o, PyObject *key)

  戻り値: 新たな参照.
  成功するとオブジェクト key に対応する o の要素を返し、 失敗すると `NULL` を返します。 Python の式 "`o[key]`" と同じです。

int `PyObject_SetItem`( | PyObject *o, PyObject *key, PyObject *v)

  オブジェクト key を値 v に対応付けます。 失敗すると `-1` を返します。 Python の文 "`o[key] = v`" と同じです。

int `PyObject_DelItem`( | PyObject *o, PyObject *key)

  オブジェクト o から key に対する対応付けを削除します。 失敗すると `-1` を返します。 Python の文 "`del o[key]`" と同じです。

int `PyObject_AsFileDescriptor`( | PyObject *o)

  Python オブジェクトからファイル記述子を取り出します。 オブジェクトが整数か長整数なら、その値を返します。 (長)整数でない場合、オブジェクトに `fileno()` メソッドがあれば 呼び出します; この場合、 `fileno()` メソッドは 整数または長整数をファイル記述子の値として返さなければなりません。 失敗すると `-1` を返します。

PyObject* `PyObject_Dir`( | PyObject *o)

  戻り値: 新たな参照.
  この関数は Python の式 "`dir(o)`" と同じで、 オブジェクトの変数名に割り当てている文字列からなるリスト (空の場合もあります) を返します。エラーの場合には `NULL` を返します。引数を `NULL`にすると、Python における"`dir()`" と同様に、現在のローカルな名前を返します; この場合、 アクティブな実行フレームがなければ `NULL` を返しますが、 `PyErr_Occurred()` は偽を返します。

PyObject* `PyObject_GetIter`( | PyObject *o)

  戻り値: 新たな参照.
  Python の式 "`iter(o)`" と同じです。 引数にとったオブジェクトに対する新たなイテレータか、 オブジェクトがすでにイテレータの場合にはオブジェクト自身を 返します。オブジェクトが反復処理不可能であった場合には `TypeError` を送出して `NULL` を返します。