Pongo 't entiende su motivación para rechazar instancias de subclases (dado que, por definición, que soportan todo el comportamiento de los soportes superclase!), pero si eso es realmente lo que insisten en hacer, entonces:
if type(arg) is not datetime.date:
raise TypeError('arg must be a datetime.date, not a %s' % type(arg))
no utilice assert
a excepción del control de cordura durante el desarrollo (se convierte en no operativa cuando se ejecuta con python -o
), y no genera el tipo incorrecto de excepción (como, por ejemplo, AssertionError
cuando un TypeError
es claramente lo que quiere decir aquí).
Usando isinstance
y luego excluyendo una subclase específica no es una manera idónea para conseguir un tipo exacto rígidamente especificado con subclases excluidos: después de todo, el usuario podría perfectamente subclase datetime.date
y añadir lo que sea que estés así que mantenga para evitar ¡rechazando instancias de datetime.datetime
específicamente! -)
Creo que la idea del polimorfismo es que las instancias de subclases son compatibles con el tipo de instancias de la clase base. Como tal, solo tiene sentido que los objetos 'datetime' sean instancias de' date', así que no creo que haya una mejor manera de hacer lo que intentas hacer. – avpx