Python では、オブジェクトの文字列表現を生成するのに 3つのやり方があります: repr() 関数 (あるいはそれと等価な バッククォートを用いた表現) を使う方法、str() 関数を使う方法、そして print 文を使う方法です。 ほとんどのオブジェクトで print 文は str() 関数と 同じですが、 必要な場合には特殊なケースとして FILE* にも表示できます。 FILE* への表示は、効率が問題となっている場合で、一時的な 文字列オブジェクトを作成してファイルに書き込むのでは効率が悪すぎることが プロファイリングからも明らかな場合にのみ使うべきです。
これらのハンドラはどれも必須ではありません。 ほとんどの型ではせいぜい tp_str ハンドラと tp_repr ハンドラを実装するだけですみます。
reprfunc tp_repr;
reprfunc tp_str;
printfunc tp_print;
tp_repr ハンドラは呼び出されたインスタンスの文字列表現を 格納した文字列オブジェクトを返す必要があります。簡単な例は以下のようなものです:
static PyObject *
newdatatype_repr(newdatatypeobject * obj)
{
return PyString_FromFormat("Repr-ified_newdatatype{{size:\%d}}",
obj->obj_UnderlyingDatatypePtr->size);
}
tp_repr ハンドラが指定されていなければ、インタプリタは その型の tp_name とそのオブジェクトの一意な識別値をもちいて 文字列表現を作成します。
tp_str ハンドラと str() の関係は、上の tp_repr ハンドラと repr() の関係に相当します。 つまり、これは Python のコードがオブジェクトのインスタンスに対して str() を呼び出したときに呼ばれます。この関数の実装は tp_repr ハンドラのそれと非常に似ていますが、得られる文字列表現は 人間が読むことを意図されています。tp_str が指定されていない場合、 かわりに tp_repr ハンドラが使われます。
以下は簡単な例です:
static PyObject *
newdatatype_str(newdatatypeobject * obj)
{
return PyString_FromFormat("Stringified_newdatatype{{size:\%d}}",
obj->obj_UnderlyingDatatypePtr->size);
}
print ハンドラは Python がその型のインスタンスを「print する」必要の あるときに毎回呼ばれます。たとえば 'node' が TreeNode 型のインスタンスだと すると、print ハンドラは Python が以下を実行したときに呼ばれます:
print node
flags 引数には Py_PRINT_RAW というフラグがあり、 これはその文字列をクォートやおそらくはエスケープシーケンスの解釈もなしで 表示することを指示します。
この print 関数は FILE* オブジェクトを引数としてとります。 たぶん、ここに出力することになるでしょう。
print 関数の例は以下のようになります:
static int
newdatatype_print(newdatatypeobject *obj, FILE *fp, int flags)
{
if (flags & Py_PRINT_RAW) {
fprintf(fp, "<{newdatatype object--size: %d}>",
obj->obj_UnderlyingDatatypePtr->size);
}
else {
fprintf(fp, "\"<{newdatatype object--size: %d}>\"",
obj->obj_UnderlyingDatatypePtr->size);
}
return 0;
}
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。