I want to have a class that I can create subclasses of that has a print function that only prints on a particular condition.
Here\'s basically what I\'m trying to do
class List(list):
def append_twice(self, *args, **kwargs):
self.append(*args, **kwargs)
self.append(*args, **kwargs)
l = List()
l.append_twice("Hello")
print(l) # ['Hello', 'Hello']
Just duplicate the named arguments for the method signature.
def print(self, *args, end='\n', sep=' ', flush=False, file=None):
if self.condition:
print(*args, end=end, sep=sep, flush=flush, file=file)
Add at the end like this
def print(self, *args, end=''):
If the arguments are dynamic or too many:
def print(self, *args, **kwargs):
I know it looks a bit ugly but works perfectly, if you are using a lot of keyword arguments and only want to build a facade for another method:
def print(self, print_message, end='\n', sep=' ', flush=False, file=None):
if self.condition:
print(**{key: value for key, value in locals().items() if key not in 'self'})
Although it's a lot of boilerplate, it avoids any duplication of parameter statements.
You might also look into using a decorator to make the conditional part more pythonic. But beware that the decorator checks the condition once prior to the class instantiation.
The standard way to pass on all arguments is as @JohnColeman suggested in a comment:
ClassWithPrintFunctionAndReallyBadName:
...
def print(self, *args, **kwargs):
if self.condition:
print(*args, **kwargs)
args
is a tuple of the non-keyword (positional) arguments, and kwargs
is a dictionary of the keyword arguments.