読者です 読者をやめる 読者になる 読者になる

pythonのソースコードを調べる

この構造体のメンバーには接頭子tp_が付けられている。
typeobjectの頭文字と予想される。

typedef struct _typeobject {
    PyObject_VAR_HEAD
    const char *tp_name; /* For printing, in format "<module>.<name>" */ #この構造体の名前を要求されたときのフォーマット?
    Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ #メモリの上限値?
    /* Methods to implement standard operations */
    destructor tp_dealloc;  #デストラクタ?
    printfunc tp_print;        #プリントファンクション?
    getattrfunc tp_getattr; #この構造体のゲッター?
    setattrfunc tp_setattr; #この構造体のセッタ?
    PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)
                                    or tp_reserved (Python 3) */ #?
    reprfunc tp_repr; #?

    /* Method suites for standard classes */

    PyNumberMethods *tp_as_number; #PyObjectが数値だった場合のメソッド(nb_add,nb_subtract,nb_multiply,nb_divmodなどへの関数へのポインタが並んで知る接頭子のnbは?
    PySequenceMethods *tp_as_sequence; #PyObjectがシーケンスタイプのオブジエクトだった場合の構造体。接頭子のsqはシーケンス(sequence)由来と思われる。おそらくリスト、タプルに適用されるのだろう
    PyMappingMethods *tp_as_mapping; #PyObjectがマッピングタイプのオブジエクトだった場合の構造体  辞書に適用されるのだろう。
    /* More standard operations (here for binary compatibility) */
    hashfunc tp_hash; #?
    ternaryfunc tp_call; #?
    reprfunc tp_str; #?
    getattrofunc tp_getattro; #?
    setattrofunc tp_setattro; #?

    /* Functions to access object as input/output buffer */
    PyBufferProcs *tp_as_buffer; #何かのバッフア?

    /* Flags to define presence of optional/expanded features */
    unsigned long tp_flags; #オプション機能/拡張機能の有無を定義するフラグ?

    const char *tp_doc; /* Documentation string */ #ドキュメント文字列へのポインタ?

    /* Assigned meaning in release 2.0 */
    /* call function for all accessible objects */
    traverseproc tp_traverse; #?

    /* delete references to contained objects */
    inquiry tp_clear; #?

    /* Assigned meaning in release 2.1 */
    /* rich comparisons */
    richcmpfunc tp_richcompare; #?

    /* weak reference enabler */
    Py_ssize_t tp_weaklistoffset; #弱い参照?

    /* Iterators */
    getiterfunc tp_iter;
    iternextfunc tp_iternext;

    /* Attribute descriptor and subclassing stuff */
    struct PyMethodDef *tp_methods; #Pythonビルトイン関数/メソッドへのポインタ
    struct PyMemberDef *tp_members; #?
    struct PyGetSetDef *tp_getset; #?
    struct _typeobject *tp_base; #?
    PyObject *tp_dict; #?
    descrgetfunc tp_descr_get; #?
    descrsetfunc tp_descr_set; #?
    Py_ssize_t tp_dictoffset; #?
    initproc tp_init; #?
    allocfunc tp_alloc; #?
    newfunc tp_new; #?
    freefunc tp_free; /* Low-level free-memory routine */ #?
    inquiry tp_is_gc; /* For PyObject_IS_GC */ #ガ-ベージコレクション?
    PyObject *tp_bases; #?
    PyObject *tp_mro; /* method resolution order */ #?
    PyObject *tp_cache; #?
    PyObject *tp_subclasses; #?
    PyObject *tp_weaklist; #?
    destructor tp_del; #?

    /* Type attribute cache version tag. Added in version 2.6 */
    unsigned int tp_version_tag; #?

    destructor tp_finalize; #?
#ifdef COUNT_ALLOCS #なし
    /* these must be last and never explicitly initialized */
    Py_ssize_t tp_allocs;
    Py_ssize_t tp_frees;
    Py_ssize_t tp_maxalloc;
    struct _typeobject *tp_prev;
    struct _typeobject *tp_next;
#endif
} PyTypeObject;

構造体の先頭にあるPyObject_VAR_HEADはPyVarObjectを表すマクロ
PyVarObjectはPyObjectにPy_ssize_t ob_sizeを追加して拡張したもののようである。