La ragione tecnica è probabile che i tipi built-in Python non tornano sottoclassi dai suoi gestori di regola vale a dire, date.__add__
non tornerà datetime
. E il comportamento coerente richiederebbe date
e datetime
di essere intercambiabili (non lo sono).
date + timedelta
il comportamento è documentato e non cambierà. Se si desidera datetime
di conseguenza; creare datetime
dalla data d
:
dt = datetime(d.year, d.month, d.day)
Tecnicamente, date.__add__
avrebbe potuto delegato il lavoro per timedelta.__radd__
. timedelta
memorizza separatamente days
e quindi è semplice ed efficiente scoprire se rappresenta un numero intero di giorni, ad esempio, potremmo ottenere date
o datetime
da date + timedelta
(ciò non significa che dovremmo).
Il problema è che 1
e 1.0
sono uguali timedelta(1)
in questo caso ovvero se dovessimo permettere date + timedelta
per tornare datetime
allora dovrebbe restituire datetime
per tutti i valori se si considerano soltanto tipi.
C'è stato un precedente quando int + int
ha restituito int
o long
a seconda del risultato, ad es., l'operazione con gli stessi tipi può restituire valori di tipi diversi a seconda solo dei valori di input. Sebbene date
e datetime
non siano intercambiabili tanto quanto lo e lo long
.
date + timedelta
tornare date
per alcuni valori di timedelta
e datetime
per gli altri potrebbero creare confusione se non introduciamo date(y,m,d) == datetime(y,m,d)
troppo (come 1 == 1.0
) o date.today() < datetime.now()
da the related Python issue mentioned by @Gareth Rees (come 1 < 1.1
). datetime
essendo una sottoclasse suggerisco questo percorso anche se ho sentito un argomento che è stato un errore rendere la sottoclasse a date
.
il comportamento desiderato è implementato in dateutil
pacchetto:
>>> from datetime import date
>>> from dateutil.relativedelta import relativedelta
>>> date.today() + relativedelta(days=1)
datetime.date(2016, 5, 12)
>>> date.today() + relativedelta(days=1, seconds=1)
datetime.datetime(2016, 5, 12, 0, 0, 1)
time() + timedelta
non è valido, quindi combine()
non mi aiuta qui.
combine()
opere datetime.combine(d, time()) + timedelta_obj
. Però, potresti scriverlo come: datetime(d.year, d.month, d.day) + timedelta_obj
.
Naturalmente, la soluzione semplice ed esplicito è datetime(2013, 1, 1, 0, 0, 0) + timedelta(seconds=42)
, ma si potrebbe anche riscrivere 3 + 0.1
come 3.0 + 0.1
)
int
+ float
è sempre float
:
>>> 3 + 1.0
4.0
>>> 3 + 1
4
differenza 1.0
e 1
; type(timedelta(1.0)) == type(timedelta(1))
(stesso tipo oltre ad essere uguale).
Sto scrivendo una routine di lettura per un formato di file in cui un campo è un anno, un campo è giorno dell'anno, un campo è millisecondi-da-mezzanotte.
dt = datetime(year, 1, 1) + timedelta(days=day_of_year - 1, milliseconds=ms)
Inoltre, quando si lavora con le date, non si vuole veramente aggiungere il tempo? Una data non ha un componente orario; non è la stessa cosa che aggiungere '.0' a un intero. Forse stavi lavorando con date * a mezzogiorno * invece? –
Direi che * numeri * sono l'eccezione qui, in quanto è possibile forzare un intero a un valore float in base alle esigenze. Questo concetto non si espande automaticamente ad altri tipi. –
@MartijnPieters Allora perché consentire quell'aggiunta in primo luogo? '[] +()' fallisce immediatamente. – user4815162342