[capi-sig] How to pass arguments to tp_new and tp_init from subtypes?
Mateusz Loskot
mateusz at loskot.net
Fri Jul 6 14:24:35 CEST 2012
Hi,
I'm reading the PEP 253 [1] on subtyping and there are plenty of good
recommendations on how to structure the types, call tp_new and tp_init
slots, etc.
But, it lacks an important note on passing arguments from sub to super type.
It seems the PEP is unfinished as per the note:
(XXX There should be a paragraph or two about argument passing here.)
So, I'm trying to extrapolate some strategies well known from the Python
classes [2] subtyping, especially techniques that each level
strips-off arguments, etc.
I'm looking for techniques to achieve similar effect to this, but
in using plain Python C API (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)
What would be the equivalent in C API?
Also, how to deal with similar situation but with arguments
specific to derived class expected in different order, it is given
at the end of the args tuple (or kwds dict, I assume principle would be same).
Here is some (pseudo-)code that illustrates the situation:
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):
Note, if the 'a' was expected first:
Derived.__init__(self, a, x, y)
it would be similar situation to the Shape and ColoredShape above.
It would be easier to deal with, I assume.
[1] http://www.python.org/dev/peps/pep-0253/
[2] http://rhettinger.wordpress.com/2011/05/26/super-considered-super/
Best regards,
--
Mateusz Loskot, http://mateusz.loskot.net
More information about the capi-sig
mailing list