Issue 26495: super() does not work in nested functions, genexps, listcomps, and gives misleading exceptions (original) (raw)

super() without arguments gives proper "super() without arguments" in functions, generator functions nested in methods, if those do not have arguments. But if you use super() in a nested function that takes an argument, or in a generator expression or a comprehension, you'd get

Got exception: TypeError super(type, obj): obj must be an instance or subtype of type

which is really annoying. Furthermore, if a nested function took another instance of type(self) as the first argument, then super() could refer unexpectedly to wrong instance:

class Bar(Foo):
    def calculate(self, other_foos):
        def complicated_calculation(other):
            super().some_method(other)

        for item in other_foos:
            complicated_calculation(item)

now the super() call would not have implied self of calculate as the first argument, but the other argument of the nested function, all without warnings.

I believe it is a mistake that these nested functions can see __class__ at all, since it would just mostly lead them misbehaving unexpectedly.