Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

818
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!