TypeError: super() takes at least 1 argument (0 given) error is specific to any python version?

BPL picture BPL · Aug 15, 2016 · Viewed 89.6k times · Source

I'm getting this error

TypeError: super() takes at least 1 argument (0 given)

using this code on python2.7.11:

class Foo(object):
    def __init__(self):
        pass

class Bar(Foo):
    def __init__(self):
        super().__init__()

Bar()

The workaround to make it work would be:

class Foo(object):
    def __init__(self):
        pass

class Bar(Foo):
    def __init__(self):
        super(Bar, self).__init__()

Bar()

It seems the syntax is specific to python 3. So, what's the best way to provide compatible code between 2.x and 3.x and avoiding this error happening?

Answer

Martijn Pieters picture Martijn Pieters · Aug 16, 2016

Yes, the 0-argument syntax is specific to Python 3, see What's New in Python 3.0 and PEP 3135 -- New Super.

In Python 2 and code that must be cross-version compatible, just stick to passing in the class object and instance explicitly.

Yes, there are "backports" available that make a no-argument version of super() work in Python 2 (like the future library) but these require a number of hacks that include a full scan of the class hierarchy to find a matching function object. This is both fragile and slow, and simply not worth the "convenience".