geekcomputers/Python · error · TypeError

The gameover_method argument must be a callable object.

Error message

The gameover_method argument must be a callable object.

What it means

Bird's constructor also validates that gameover_function is callable, since Bird must invoke it when the bird collides or falls. Passing a non-callable (e.g. a method result instead of the method, or None) raises this TypeError.

Source

Thrown at Flappy Bird - created with tkinter/Bird.py:39

    climbsUp = 0.0911458333

    def __init__(
        self,
        background,
        gameover_function,
        *screen_geometry,
        fp="bird.png",
        event="<Up>",
        descend_speed=5,
    ):
        # Verifica se "background" é uma instância de Background e se o "gamerover_method" é chamável

        if not isinstance(background, Background):
            raise TypeError(
                "The background argument must be an instance of Background."
            )
        if not callable(gameover_function):
            raise TypeError("The gameover_method argument must be a callable object.")

        # Instância os parâmetros
        self.__canvas = background
        self.image_path = fp
        self.__descend_speed = descend_speed
        self.gameover_method = gameover_function

        # Recebe a largura e altura do background
        self.__width = screen_geometry[0]
        self.__height = screen_geometry[1]

        # Define a decida e subida do pássaro com base na altura do background
        self.decends *= self.__height
        self.decends = int(self.decends + 0.5)
        self.climbsUp *= self.__height
        self.climbsUp = int(self.climbsUp + 0.5)

        # Invoca o método construtor de Thread

View on GitHub (pinned to 40f4cd2652)

Solutions

  1. Pass the function/method itself without parentheses: Bird(bg, self.game_over)
  2. If it's a bound method of another object, pass obj.method_name, not obj.method_name()
  3. If the callback may be absent, pass a no-op lambda: lambda: None

Example fix

# before
bird = Bird(bg, self.game_over())
# after
bird = Bird(bg, self.game_over)
Defensive patterns

Strategy: type-guard

Validate before calling

if not callable(gameover_function):
    gameover_function = lambda: None

Type guard

def is_callable(fn) -> bool:
    return callable(fn)

Try / catch

try:
    bird = Bird(bg, game_over)
except TypeError as e:
    print('gameover_function must be callable:', e)

Prevention

When it happens

Trigger: Passing game_over() (called, returns None) instead of game_over; passing a string name of the method, None, or an object without __call__.

Common situations: Accidentally calling the callback at construction site; renaming the game-over method but passing the old attribute; defaulting the parameter to None in a refactor.

Related errors


AI-assisted analysis of geekcomputers/Python@40f4cd2652 (2026-08-27). Data as JSON: /api/errors/4c9f1a5671b195fb. Report an issue: GitHub.