Pasando argumentos a tp_new y tp_init desde subtipos en la API de Python C

Originalmente hice esta pregunta en la lista de capi-sig de Python:¿Cómo pasar argumentos a tp_new y tp_init desde subtipos?

Estoy leyendo el pitonPEP-253 sobre subtipos y hay muchas buenas recomendaciones sobre cómo estructurar los tipos, llametp_new ytp_init ranuras, etc.

Pero, carece de una nota importante sobre la transmisión de argumentos de subtipo a supertipo. Parece elPEP-253 está sin terminar según la nota:

(XXX Debe haber un párrafo o dos sobre el argumento que pasa aquí).

Entonces, estoy tratando de extrapolar algunas estrategias.bien conocido de las clases de Python subtipo, especialmente las técnicas que cada nivel quita los argumentos, etc.

Estoy buscando técnicas para lograr un efecto similar a esto, pero usando técnicas sencillas.API de Python C (3.x):

class Shape:
    def __init__(self, shapename, **kwds):
        self.shapename = shapename
        super().__init__(**kwds)

class ColoredShape(Shape):
    def __init__(self, color, **kwds):
        self.color = color
        super().__init__(**kwds)

¿Cuál sería el equivalente en la API de Python C?

¿Cómo lidiar con una situación similar pero con argumentos específicos para la clase derivada esperados en un orden diferente? Se trata de argumentos dados al final de la tupla de args (okwds Dic, supongo que el principio sería igual).

Aquí hay un código (pseudo-) que ilustra la situación:

class Base:
   def __init__(self, x, y, z):
      self.x = x
      self.y = y
      self.z = z

class Derived(Base):
   def __init__(self, x, y, a):
      self.a = a
      super().__init__(x, y, None):

Tenga en cuenta, si ela se esperaba primero

Derived.__init__(self, a, x, y)

Sería una situación similar a laShape yColoredShape encima. También sería más fácil de tratar, supongo.

¿Alguien podría ayudar a descubrir a los desaparecidos?XXX ¿El comentario mencionado anteriormente y la técnica correcta para pasar los argumentos desde el subtipo hasta los súper tipos en la construcción?

ACTUALIZACIÓN 2012-07-17:

Inspirado porrespuesta de ecatmur A continuación miré a través de fuentes de Python 3 y encontrédefdict_init constructor decolecciones.defaultdict Tipo de objeto interesante. El tipo se deriva dePyDictObject y su constructor toma argumento adicional dedefault_factory. La firma del constructor en la clase Python es esta:

class collections.defaultdict([default_factory[, ...]])

Ahora, aquí es cómo eldefault_factory es despojado del originalargs tupla, por lo que el resto de argumentos se remite a latp_init de tipo base, esPyDictObject:

int result;
PyObject *newargs;
Py_ssize_t n = PyTuple_GET_SIZE(args);
...
newargs = PySequence_GetSlice(args, 1, n);
...
result = PyDict_Type.tp_init(self, newargs, kwds);

Tenga en cuenta, esta presencia cortada sólo la parte relevante de ladefdict_init función.

Respuestas a la pregunta(3)

Su respuesta a la pregunta