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?
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".