Inside my class I have:
def refresh(self, func = None, *args):
if not func:
return
new_data = func(*args)
self.set_text(new_data)
But I have 2 problems:
What if
funcdoesn't take any parameters? Why can't I do*args = None? like I want to do something like this:def refresh(self, func = None, *args = None): if not func: return if *args: new_data = func(*args) else: new_data = func() # func doesn't take any parameters self.set_text(new_data)When I try to run my code before the edits I get:
TypeError: function takes 0 positional arguments but 1 were given
Why is that?
Here is my main:
def hello_world():
return 'hello'
tmp2 = LLabel('Hi There!')
tmp2.refresh(hello_world, None)
CodePudding user response:
You get the error "takes 0 positional arguments but 1 were given" because here
tmp2.refresh(hello_world, None)
the original implementation of refresh will not pass no argument to hello_world, but one argument, namely None.
Instead, just don't provide any further arguments to refresh:
tmp2.refresh(hello_world)
Then, inside refresh, args will be an empty tuple and func(*args) will be equivalent to func().
The alternative implementation of refresh, which you have attempted to use, is not necessary.
CodePudding user response:
None is an argument of NoneType. You can try it simply by running the hello_world function by itself.
def hello_world():
return 'hello'
hello_world(None)
Which will result in the following error: TypeError: hello_world() takes 0 positional arguments but 1 was given.
Hence run the refresh method, with only one argument - the function you want to pass in:
def hello_world():
return 'hello'
tmp2 = LLabel('Hi There!')
tmp2.refresh(hello_world)
Therefore the original refresh method can stay the same:
def refresh(self, func = None, *args):
if not func:
return
new_data = func(*args)
self.set_text(new_data)
CodePudding user response:
*args is of type tuple.
If your function doesn't take parameters, that means you have an empty tuple args. And an empty tuple is a falsy value in Python.
So your function can look like this:
def refresh(self, func = None, *args):
if not func:
return
if args: # evaluates to True if not empty
new_data = func(*args)
else:
new_data = func() # func doesn't take any parameters
self.set_text(new_data)
The unpacking operator * is not needed in the if condition. It is actually a SyntaxError.
If you now call your refresh method, passing a function that doesn't take any parameters, you just need to pass the function to the method:
def hello_world():
return 'hello'
tmp2 = LLabel('Hi There!')
tmp2.refresh(hello_world)
CodePudding user response:
In the call to refresh, you can just omit any additional arguments:
tmp2.refresh(hello_world)
This will cause the args variable within the function to be set an empty tuple, so the call to fn results in an empty argument list.
