Debido a la existencia de los operadores de fecha, hora y adición de fecha y hora de tipo cruz y resta, yo creo que esto está bien, siempre y cuando esté bien definido.
Actualmente (2.7.2):
date = date + timedelta
date = date - timedelta
timedelta = date - date
datetime = datetime + timedelta
datetime = datetime - timedelta
timedelta = datetime - datetime
Creo que el siguiente también es razonable para una extensión:
timedelta = time - time
datetime = date + time
que iba a sugerir lo siguiente también, pero tiene muy time
valores mínimos y máximos específicos para hour
, minute
, second
y microsecond
, lo que requiere un envolvente silencioso de los valores o la devolución de un tipo diferente:
time = time + timedelta
time = time - timedelta
Del mismo modo, date
no se puede manejar un timedelta
de menos de un día que se le agrega. A menudo me han dicho simplemente usar Duck Typing con Python, porque esa es la intención. Si eso es cierto, entonces yo propondría la siguiente interfaz completado:
[date|datetime] = date + timedelta
[date|datetime] = date - timedelta
timedelta = date - date
[time|timedelta] = time + timedelta
[time|timedelta] = time - timedelta
timedelta = time - time
datetime = datetime + timedelta
datetime = datetime - timedelta
datetime = date + time
datetime = date - time
timedelta = datetime - datetime
timedelta = datetime - date
timedelta = timedelta + timedelta
timedelta = timedelta - timedelta
En el que, dado el caso de que date
tiene pérdida de precisión (por timedelta
's con días parciales), se promueve a datetime
. Del mismo modo, dado el caso en el que time
tiene una pérdida de precisión (para timedelta
que arrojan un resultado de más de un día o un tiempo negativo), se promueve a timedelta
. Sin embargo,, no me siento cómodo con [time|timedelta]
. Tiene sentido dado el resto de la interfaz desde el paralelismo y las vistas de precisión, pero creo que podría ser más elegante simplemente envolver el tiempo a la hora correcta, cambiando así todas las [time|timedelta]
a simplemente time
, pero desafortunadamente eso nos deja con la precisión perdida.
La clase de tipo Haskell 'Number' define operadores aritméticos como' (+) 'como' Number a => a -> a -> a' (es decir, toma dos argumentos con un tipo que es una instancia de 'Number' y devuelve exactamente ese tipo). A veces deseo que otros idiomas con la sobrecarga del operador impongan tales restricciones. En Python, '+' es ** suma ** o ** concatenación **, nada más. Sobrecargarlo en un asunto completamente diferente solo ayuda a ... exagerar a las personas que creen que la sobrecarga del operador es horrible. ¿Qué hay de malo con el uso de una función/método para esto? – delnan
@delnan: no pasa nada, la pregunta realmente fue sobre qué está mal con la sobrecarga y por qué combinar una fecha + hora es una operación tan distinta de la suma o la concatenación. –
Puede agregar una propiedad o método 'medianoche' a' MyDate' (devolviendo 'MyDateTime'), y tal vez cambiar' MyTime' en 'MyTimeSpan', luego definir' __add__' tiene más sentido ('mydatetime = mydate.midnight + mytimespan'). – adw