Frage

The C PyObject structure contains the fields tp_as_number, tp_as_sequence and tp_as_mapping. In which circumstances are these invoked? Can anybody provide some example Python code which would result in these C methods being called?

War es hilfreich?

Lösung

Those methods are the equivalent of python's special methods, and are called in the same circumstances. For example tp_as_number->nb_add is called when executing a + b and a is the extension type. It is the equivalent of __add__. The inplace_* functions are the equivalents of __i*__ methods.

Note that the __r*__ methods are implemented simply swapping arguments to the normal functions, thus 5 + a where a is an extension type will first try to call the numeric version of nb_add, after this failed it tries nb_add of a putting 5 as first argument and a as the second one.

The same is true for the tp_as_mapping and tp_as_sequence structs. The mp_length and sq_length functions are called by the built-in function len, and are the equivalent of __len__. Theoretically you could implement different functions for mp_length and sq_length, in which case the sq_length has precedence(this can be seen from the source code, even though I don't know whether this behaviour is documented).

Also note that, for example, the + operator can be implemented in different functions. The sq_concat is called after trying nb_add, and thus an extension type can support + operator without having an nb_add function set.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top