C PyObject構造には、フィールドとが含まれてtp_as_numberいtp_as_sequenceますtp_as_mapping。これらはどのような状況で呼び出されますか?これらのCメソッドが呼び出される結果となるPythonコードの例を誰かが提供できますか?
1 に答える
これらのメソッドは python の特別なメソッドと同等であり、同じ状況で呼び出されます。たとえばtp_as_number->nb_add、実行時に呼び出されa + b、a拡張タイプです。と同等です__add__。inplace_*関数はメソッドと同等です__i*__。
__r*__メソッドは引数を通常の関数に交換するだけで実装されていることに注意してください。したがって5 + a、a拡張型は最初に の数値バージョンを呼び出そうとします。これがnb_add失敗した後、最初の引数と2 番目の引数として配置しようとします。nb_adda5a
tp_as_mappingand構造体についても同様ですtp_as_sequence。および関数は組み込み関数 によって呼び出され、mp_lengthと同等です。理論的には、とに異なる関数を実装できます。その場合、が優先されます (この動作が文書化されているかどうかはわかりませんが、これはソース コードから確認できます)。sq_lengthlen__len__mp_lengthsq_lengthsq_length
また、たとえば、+演算子はさまざまな関数で実装できることに注意してください。はsq_concatを試行した後に呼び出されるnb_addため、拡張型は関数を設定+しなくても演算子をサポートできます。nb_add