Quiero tener una clase de la que pueda crear subclases que tenga una función de impresión que solo imprima en una condición particular.
Esto es básicamente lo que estoy tratando de hacer:
class ClassWithPrintFunctionAndReallyBadName: ... def print(self, *args): if self.condition: print(*args) Esto ya funciona, excepto por el hecho de que hay argumentos que deben establecerse explícitamente con la función de print predeterminada, como end (ejemplo: print('Hello, world!', end='') ). ¿Cómo puedo hacer que la función de print de mi nueva clase acepte argumentos como end='' y los pase a la print predeterminada?
La forma estándar de transmitir todos los argumentos es como sugirió @JohnColeman en un comentario:
class ClassWithPrintFunctionAndReallyBadName: ... def print(self, *args, **kwargs): if self.condition: print(*args, **kwargs) Como parámetros, *args recibe una tupla de argumentos que no son palabras clave (posicionales), y **kwargs es un diccionario de argumentos de palabras clave.
Al llamar a una función con * y ** , la primera tupla se expande como si los parámetros se pasaran por separado y el último diccionario se expande como si fueran parámetros de palabras clave.
Sé que se ve un poco feo pero funciona perfectamente, si está usando muchos argumentos de palabras clave y solo quiere construir una fachada para otro método:
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'})Aunque es mucho repetitivo, evita cualquier duplicación de declaraciones de parámetros.
También puede considerar usar un decorador para hacer que la parte condicional sea más pitónica. Pero tenga en cuenta que el decorador verifica la condición una vez antes de la instanciación de la clase.
Simplemente duplique los argumentos con nombre para la firma del método.
def print(self, *args, end='\n', sep=' ', flush=False, file=None): if self.condition: print(*args, end=end, sep=sep, flush=flush, file=file)