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?
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]
...
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):
...
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):
...