2010-05-04 5 views
14

Actualmente estoy usando una declaración assert con isinstance. Como datetime es una subclase de date, también debo verificar que no sea una instancia de datetime. Seguramente hay una mejor manera?¿Cómo debo verificar que un argumento dado sea un objeto datetime.date?

manera
from datetime import date, datetime 

def some_func(arg): 
    assert isinstance(arg, date) and not isinstance(arg, datetime),\ 
     'arg must be a datetime.date object' 
    # ... 
+0

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

Respuesta

28

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! -)

+0

¡Gracias! Normalmente, no pensaría en hacer este tipo de comprobación, pero como publiqué en la otra respuesta: estoy escribiendo una función de trazado de gráfico para los datos diarios, y si transfiere un objeto datetime, la información escupe es un galimatías (pero puede parecer correcto a primera vista).Si surgiera una excepción en algún lugar durante la ejecución de mi función, no me molestaría, pero me confundió cuando pasé accidentalmente en un 'datetime' y no quisiera hacerle eso a un usuario de mi biblioteca. – rmh

+0

Ah, y gracias por señalar mi uso indebido de 'AssertionError'. Un 'TypeError' es de hecho lo que quise decir. – rmh

+1

Esto parece no funcionar más. – sorin

3

El Python no es para comprobarlo, sólo seguir adelante y dejar que el código hace lo que tiene que hacer, y si el objeto no tiene un método requerido o algo así, el código fallará con una excepción en el punto donde se llamará ese método. Esto se llama duck typing y es parte de lo que hace que Python sea tan flexible.

Ahora, si realmente no puede aceptar un objeto datetime.datetime ... bueno, ¿por qué no? Un datetime puede hacer cualquier cosa que date pueda hacer, así que no puedo imaginarme la razón por la que tendría que rechazar un datetime, o cualquier subclase de date.

Si realmente tiene una buena razón para hacer esto (supongo que tal vez como una cosa depuración, pero incluso entonces, yo no lo entiendo ...):

assert type(arg) == datetime.date 
+1

Estoy escribiendo una función de trazado de gráfico para datos día a día, y si transfiere un objeto 'datetime', la información que escupe es un galimatías (pero puede parecer correcta a primera vista). Por esta razón, preferiría hacer una excepción que escupir datos que podrían dejar a un usuario de mi biblioteca desconcertado y rascándose la cabeza por un tiempo. Si surgiera una excepción en algún lugar, no me molestaría en hacer esto, pero dado que podría confundir a alguien que usa accidentalmente 'datetime', preferiría hacer una excepción. – rmh

+0

Gracias por su edición; ese ejemplo ayudó! No sé por qué no pensé usar 'type()'. – rmh

5

Si su problema es que el gráfico no funciona bien porque está usando fracciones de un día, puede probarlo de otras maneras, por ejemplo hasattr(arg, 'hour') distingue entre una instancia datetime y una instancia date.

Cuestiones relacionadas