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

PythonPython 2.7Python 2.x

Python Problem Overview


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?

Python Solutions


Solution 1 - Python

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

Solution 2 - Python

This is because of version of python. Check your python version with [python --version] it might be 2.7

In 2.7 use this [ super(baseclass, self).__init__() ]

class Bird(object):
    def __init__(self):
        print("Bird")
    
    def whatIsThis(self):
        print("This is bird which can not swim")
        
class Animal(Bird):
    def __init__(self):
        super(Bird,self).__init__()
        print("Animal")
        
    def whatIsThis(self):
        print("THis is animal which can swim")
        
a1 = Animal()
a1.whatIsThis()

> In 3.0 or more use this [ super().__init__()]

class Bird(object):
    def __init__(self):
        print("Bird")
    
    def whatIsThis(self):
        print("This is bird which can not swim")
        
class Animal(Bird):
    def __init__(self):
        super().__init__()
        print("Animal")
        
    def whatIsThis(self):
        print("THis is animal which can swim")
        
a1 = Animal()
a1.whatIsThis()

Solution 3 - Python

You can use the future library to have a Python2/Python3 compatibility.

The super function is back-ported.

Solution 4 - Python

Your default python --version is probably python2, you need to switch to python3 to use this syntax, to do so paste the following command in your terminal.

sudo update-alternatives --config python

If you get the error "no alternatives for python" then set up an alternative yourself with the following command:

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

then check your python version with

python --version

if you get a version 3.+ then your problem is solved.

Solution 5 - Python

for python 3.6 super(Bird,self).init() not working super(Animal,self).init() worked for me.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBPLView Question on Stackoverflow
Solution 1 - PythonMartijn PietersView Answer on Stackoverflow
Solution 2 - PythonViraj WadateView Answer on Stackoverflow
Solution 3 - PythonLaurent LAPORTEView Answer on Stackoverflow
Solution 4 - PythonManzur AlahiView Answer on Stackoverflow
Solution 5 - PythonÖzlem HümaView Answer on Stackoverflow