Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

819
Visualizações
Python decorator in a class: missing required positional arguments:
class Something:
    def __init__(self, ...):
       ...

    def update(self):
       ...

    def add_update(self, func):
      def fct(*args, **kwargs):
          self.update()
          func(*args, **kwargs)
      return fct 

    @add_update
    def method(self, some_parameter):
       ...

So basically I have this class, and I want to call the function "update()" automatically before I call a method from the class. But I get this error:

TypeError: add_update() missing 1 required positional argument: 'func'

I don't really understand what's wrong here, also I saw some tutorials on the internet where they did something similar and it was working. Can someone explain me what's wrong here and how do I fix it?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

What is a decorator? It's syntactic sugar for more verbose syntax.

@decorator
def my_fun():
   ...

is the same as

my_fun = decorator(my_fun)

So in your specific case

method = add_update(method)

Do you see a problem? Add update expects two parameters (self, and func), but here it gets only one (and actually you pass method as self).

To solve this you need to create decorator outside the class that gets only function, and that functions first parameter will be self:

def add_update(func):
     def wrapper(*args):
         self = args[0]
         ...
over 4 years ago · Santiago Trujillo Relatório

0

when you use @add_update, It is equivalent to add_update(method), At this time add_update is still a function.

You can make the following modifications to make it work

class Something:
    def __init__(self):
        ...

    def update(self):
        ...

    def add_update(f):
        def fct(self, *args, **kwargs):
            self.update()
            return f(self, *args, **kwargs)

        return fct

    @add_update
    def method(self, some_parameter):
        ...

over 4 years ago · Santiago Trujillo Relatório

0

You have to pass the argument func and define the class inside the decorator function.

class Something:
    def __init__(self,..):
        ...
      

    def update(self):
       ...

    def add_update( func):
      def fct(*args, **kwargs):
          args[0].update() #or Something.update()
          func(*args, **kwargs)
      return fct 

    @add_update
    def method(self, some_parameter):
        ...
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda