AFAIU, desea asegurarse de que algunos objetos se comportan ("seguir una interfaz") en un momento anterior al del uso real. En su ejemplo, desea saber que los objetos son apropiados en el momento de creación de la instancia, no cuando realmente se utilizarán.
Teniendo en cuenta que estamos hablando de Python aquí, no sugeriré assert
(¿qué ocurre si python -O
o una variable de entorno PYTHONOPTIMIZE está configurada en 1 cuando se ejecuta el programa?) O la comprobación de tipos específicos (debido a que restringe innecesariamente los tipos que puede utilizar), pero voy a sugerir las primeras pruebas funcionalidad, algo a lo largo de las líneas:
def __init__(self, a_number, a_boolean, a_duck, a_sequence):
self.a_number= a_number + 0
self.a_boolean= not not a_boolean
try:
a_duck.quack
except AttributeError:
raise TypeError, "can't use it if it doesn't quack"
else:
self.a_duck= a_duck
try:
iter(a_sequence)
except TypeError:
raise TypeError, "expected an iterable sequence"
else:
self.a_sequence= a_sequence
Solía try… except… else
en esta sugerencia porque quiero establecer los miembros de instancia única si la prueba tuvo éxito, incluso si el código se cambia o aumenta. No tienes que hacerlo así, obviamente.
Para argumentos de funciones y propiedades de configuración, no haría estas pruebas con antelación, solo usaría los objetos provistos y actuaría en excepciones lanzadas, a menos que los objetos sospechosos vayan a usarse después de un largo proceso.
Python tipo de falla - no escala; Prefiero usar Mono. –