pythonpython-3.xsuper

Python 3 RuntimeError: super(): no arguments


Why do I get this error?

super().display()  
 RuntimeError: super(): no arguments

I tried to call the display function from class Project in Progress.display() how to display the user's input? Here's the code:

class Project:
    def __init__(self, name="", job="", **kwargs):
        super().__init__(**kwargs)
        self.name = name
        self.job = job

    def display():
        print("name: ", (self.name))
        print("job: ", (self.job))

    @staticmethod
    def prompt_init():
        return dict(name=input("name: "), job=input("job: "))


class Stages(Project):
    def __init__(self, stages="", **kwargs):
        super().__init__(**kwargs)
        self.stages = stages

    def display(self):
        super().display()
        print("stages: ", (self.stages))

    @staticmethod
    def prompt_init():
        parent_init = Project.prompt_init()

        choice = None
        while choice not in (1, 2, 3, 4, 5, 6):

            print("Insert your stage now: ")
            print("1. Planning")
            print("2. Analysis")
            print("3. Design")
            print("4. Implementation")
            print("5. Testing")
            print("6. Release")

            choice = input("enter your choice: ")
            choice = int(choice)

            if choice == 1:
                stages = "Planning"
            elif choice == 2:
                stages = "Analysis"
            elif choice == 3:
                stages = "Design"
            elif choice == 4:
                stages = "Implementation"
            elif choice == 5:
                stages = "Testing"
            elif choice == 6:
                stages = "Release"
            else:
                print("no such input, please try again")

            print(name)
            print(stages)


class Progress(Project):
    def __init__(self, progress="", **kwargs):
        super().__init__(**kwargs)
        self.progress = progress

    def display(self):
        super().display()
        print("progress: ", (self.progress))

    @staticmethod
    def prompt_init():
        parent_init = Project.prompt_init()

        choice = None
        while choice not in (1, 2, 3, 4):

            print("1. 25%")
            print("2. 50%")
            print("3. 75%")
            print("4. 100%")

            choice = input("enter your choice[1-4]: ")
            choice = int(choice)

            if choice == 1:
                progress = "25%"
            elif choice == 2:
                progress = "50%"
            elif choice == 3:
                progress = "75%"
            elif choice == 4:
                progress = "100%"
            else:
                print("no such input, please try again")

            print(progress)
        parent_init.update({"progress": progress})
        return parent_init


class A(Stages, Progress):
    def prompt_init():
        init = Stages.prompt_init()
        init.update(Progress.prompt_init())
        return init

    prompt_init = staticmethod(prompt_init)


class New:
    type_map = {("stages", "progress"): A}

    def add_project_test(self, name, job, stages):
        init_args = Project.prompt_init()
        self.project_list.append(Project(**init_args))

    def __init__(self):
        self.project_list = []

    def display_project():
        for project in self.project_list:
            project.display()
            print()

    def add_progress(self):
        init_args = Progress.prompt_init()
        self.project_list.append(Progress(**init_args))

    def add_project(self):
        ProjectClass = self.type_map[A]
        init_args = ProjectClass.prompt_init()
        self.property_list.append(ProjectClass(**init_args))


my_list = New()
my_list.add_progress()
my_list.display_project()

Solution

  • Every time you use super() in a method, you need to be in an instance method or a class method. Your staticmethods don't know what their superclasses are. Observe:

    class Funky:
        def groove(self):
            print("Smooth")
    
        @staticmethod
        def fail():
            print("Ouch!")
    
        @classmethod
        def wail(cls):
            print("Whee!")
    
    
    class Donkey(Funky):
        def groove(self):
            print(super())
    
        @staticmethod
        def fail():
            try:
                print(super())
            except RuntimeError as e:
                print("Oh no! There was a problem with super!")
                print(e)
    
        @classmethod
        def wail(cls):
            print(super())
    
    
    a_donkey = Donkey()
    a_donkey.groove()
    a_donkey.fail()
    a_donkey.wail()
    

    Outputs:

    <super: <class 'Donkey'>, <Donkey object>>
    Oh no! There was a problem with super!
    super(): no arguments
    <super: <class 'Donkey'>, <Donkey object>>
    

    Here's your code, debugged and with some extra functionality and tests:

    class Project:
        def __init__(self, name="", job="", **kwargs):
            super().__init__(**kwargs)
            self.name = name
            self.job = job
    
        def display(self):
            print("name: ", self.name)
            print("job: ", self.job)
    
        @staticmethod
        def prompt_init():
            return dict(name=input("name: "), job=input("job: "))
    
    
    class Progress(Project):
        def __init__(self, progress="", **kwargs):
            super().__init__(**kwargs)
            self.progress = progress
    
        def display(self):
            super().display()
            print("progress: ", self.progress)
    
        @staticmethod
        def prompt_init():
            parent_init = Project.prompt_init()
            progress = input("your progress: ")
            parent_init.update({
                "progress": progress
            })
            return parent_init
    
    
    class New:
        def __init__(self):
            self.project_list = []
    
        def display_project(self):
            for project in self.project_list:
                project.display()
                print()
    
        def add_project(self):
            init_args = Project.prompt_init()
            self.project_list.append(Project(**init_args))
    
        def add_progress(self):
            init_args = Progress.prompt_init()
            self.project_list.append(Progress(**init_args))
    
    
    my_list = New()
    my_list.add_project()
    my_list.add_progress()
    my_list.display_project()