super in Python 3 and variadic arguments

Marco Buttu marco.buttu at gmail.com
Thu Oct 10 08:54:10 EDT 2013


On 10/10/2013 01:04 PM, Ned Batchelder wrote:

> On 10/10/13 3:22 AM, Marco Buttu wrote:
>> >>> import inspect
>> >>> class B(A):
>> ...     def bfoo(*args):
>> ...         frame = inspect.currentframe()
>> ...         for obj, value in frame.f_locals.items():
>> ...             print(obj, value, sep=' --> ')
>> ...         # super().afoo(*args[1:])
>> ...
>> >>> B().bfoo(1, 2, 3)
>> args --> (<__main__.B object at 0x7f28c960a590>, 1, 2, 3)
>> frame --> <frame object at 0x7f28cad4b240>
>>
>> So, why does not super use it?
>>
>
> Python has never claimed the kind of purity that makes everything work
> in a totally simple consistent way.  super() with no args is a kind of
> hack to begin with.  It involves a special case in the compiler (so that
> using the name "super" as a function call will act as if you had
> accessed the name "__class__" so that super can find it later), and
> inspecting the stack frame during execution.

It seems reasonable

> It's an interesting case of the Zen of Python.  It violates one
> ("explicit is better than implicit"), but only because of another one
> ("practicality beats purity").  super(MyClass, self) in Python 2 is the
> kind of brain-bender that so many people get wrong at first, that it's
> helped plenty of people to do the arguments implicitly, even if there
> are oddball edge cases that it doesn't seem to handle properly.
>
> --Ned.

Thanks for the comprehensive answer ;)

-- 
Marco Buttu



More information about the Python-list mailing list