La validación de Python Argumentos en las Subclases
-
20-08-2019 - |
Pregunta
Estoy tratando de validar un par de python argumentos.Hasta que tengamos la nueva estáticos en Python 3.0, ¿cuál es la mejor manera de ir sobre esto.
Aquí está un ejemplo de lo que estoy tratando de:
class A(object):
@accepts(int, int, int)
def __init__(a, b, c):
pass
class B(A):
@accepts(int, int, int, int)
def __init__(a, b, c, d):
A.__init__(a, b, c)
Como se puede ver el decorador está muy bien realizar la comprobación del tipo de las entradas a mi clase, pero tengo que definir todos los argumentos de la segunda clase, que se pone muy desagradable cuando tengo varios niveles de la herencia.Puedo usar kwargs con cierto éxito, pero no es tan agradable como el enfoque anterior para la comprobación de tipos.
Básicamente quiero pop un argumento fuera de la kwargs lista y verificación del tipo, a continuación, pasar el resto es de los padres, pero no esta en un muy flexible y limpio como este escalas.
Alguna sugerencia?
Solución
¿Por qué no acaba de definir un any
valor, y decorar el constructor de la subclase con @accepts(any, any, any, int)
?Su decorador no revise los parámetros marcados con any
, y el @accepts
en al constructor de la superclase comprobación de todos los argumentos que se pasan a ella por sus subclases.
Otros consejos
Usted podría querer jugar con el inspect
el módulo.Que le vamos a enumerar las superclases, las listas de argumentos, y otras cosas divertidas.Parece que usted puede ser que desee inspeccionar la lista de argumentos de la superclase __init__
método y compararla con lo que tienes en la subclase.No estoy seguro de si esto va a funcionar para usted o no.
Podría ser cuidadoso acerca de lo que las suposiciones que hacer sin embargo.Que podría no ser seguro asumir que sólo porque la clase a tiene N argumentos a __init__
, subclases contendrá al menos N argumentos y aprueba a la primera N a través de la super clase.Si la subclase es más específico, entonces podría llenar todo por 2 de los argumentos de sus superclases __init__
método.