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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top