What are slot wrapper objects?
I got curious about what 'slot wrapper' objects are after I encountered them in FindingMethodProviderII, so I went digging in the CPython source. It turns out that the answer requires understanding the internal structure of CPython.
Python types written in C start with a big structure that defines
various details about them, including a large number of pointers to
functions that implement various basic operations such as deallocating
objects of this type, getting and setting attributes, comparison, and
so on. Many but not all of these correspond to Python level canonical
methods like __repr__
; however, when CPython actually calls these
core functions it doesn't go through a Python-level method lookup
and instead makes a direct call to the C function pointed to by, eg,
type->tp_repr
.
As a service, the CPython core that registers a new type automatically
creates a __dict__
object and populates it with names for all of the
function slot pointers that correspond to the canonical methods, so that
you can actually do things like get and invoke the __init__
function
of a built in type. These names can't point directly to the C functions;
instead they point to (you guessed it) special 'slot wrapper' objects,
which encapsulate all the information necessary to actually call the C
functions from Python.
The one exception to this is __new__
, which is done differently for
reasons that I'll cover in a future entry.
|
|