You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Confusing error message when dividing timedelta using / #45424
I discovered the hard way today that this won't work:
>>> import datetime
>>> d = datetime.timedelta(1)
>>> d /2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'datetime.timedelta' and 'int'
The error message is misleading, because in fact timedelta
objects *do* support division by ints, just not with the
/ operator:
>>> d //2
datetime.timedelta(0, 43200)
Is there some way the error message can be improved,
perhaps by identifying the denominator as effectively
a float?
If you set nb_true_div on timedelta objects to delta_divide (just like
nb_floor_div) you won't have this problem as the division will just
work. Otherwise there is no other good way as if the divisor doesn't
work you need to return NotImplemented, which then tries the right-hand
object which fails, and 'object' returns the TypeError. Best you could
do is a warning or something.
But it might make sense to only set it on nb_true_div as the division
does not round anything.
The current behaviour is consistent with the integer divison:
>>> 21//10
2
>>> timedelta(microseconds=20) //10
datetime.timedelta(0, 0, 2)
Whereas int/int gives float:
>>> 21/10
2.1000000000000001
>> timedelta(microseconds=20) / 1
...
TypeError: unsupported operand type(s) for /: ...
Now in the real world, it's hard to understand that the operator //
should be used instead of /. So timedelta()/int might be an alias to
timedelta()//int.
tebeka commented on Mar 18, 2010
tebekamannequin
Mannequin
More actions
I see the same problem when "from __future__ import division" on the 2.x series. Seem like the timedelta objects is missing the __truediv__ method.
l0nwlf commented on Mar 31, 2010
l0nwlfmannequin
Mannequin
More actions
I do not understand why python2.7 is marked in Version tag ?
I reproduced the error on 3.1 but no isues on 2.7
06:39:30 l0nwlf-MBP:data $ python2.7
Python 2.7a4+ (trunk:78750, Mar 7 2010, 08:09:00)
[GCC 4.2.1 (Apple Inc. build 5646) (dot 1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> d = datetime.timedelta(1)
>>> d /2
datetime.timedelta(0, 43200)
>>> d //2
datetime.timedelta(0, 43200)
>>>
06:41:13 l0nwlf-MBP:data $ python3.1
Python 3.1.1 (r311:74480, Mar 21 2010, 20:21:46)
[GCC 4.2.1 (Apple Inc. build 5646) (dot 1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> d = datetime.timedelta(1)
>>> d /2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'datetime.timedelta' and 'int'
>>> d //2
datetime.timedelta(0, 43200)
>>>
tebeka commented on Mar 31, 2010
tebekamannequin
Mannequin
More actions
It's marked on 2.7 due to the following (this is svn 79528)
>>> from datetime import timedelta
>>> d = timedelta(1)
>>> d /2
datetime.timedelta(0, 43200)
>>> d //2
datetime.timedelta(0, 43200)
>>> from__future__import division
>>> d /2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'datetime.timedelta' and 'int'
>>>
AlexanderBelopolsky commented on Apr 20, 2010
AlexanderBelopolskymannequin
Mannequin
More actions
This is certainly not a bug, so I don't think targeting 2.7 is appropriate. I have explained in a comment on bpo-2706 (see msg75917) why I believe true division of timedelta by int should not be supported. In short, true division of timedelta by int is supposed to return fractional number of microseconds, but python lacks a type that can represent it.
I think it's fine to do the division and round the result to the nearest whole number of microseconds. I don't see any good reason for disallowing timedelta / int (or even timedelta / float).
Activity
smontanaro commentedon Sep 1, 2007
I discovered the hard way today that this won't work:
The error message is misleading, because in fact timedelta
objects *do* support division by ints, just not with the
/ operator:
Is there some way the error message can be improved,
perhaps by identifying the denominator as effectively
a float?
brettcannon commentedon Sep 14, 2007
If you set nb_true_div on timedelta objects to delta_divide (just like
nb_floor_div) you won't have this problem as the division will just
work. Otherwise there is no other good way as if the divisor doesn't
work you need to return NotImplemented, which then tries the right-hand
object which fails, and 'object' returns the TypeError. Best you could
do is a warning or something.
But it might make sense to only set it on nb_true_div as the division
does not round anything.
vstinner commentedon Nov 11, 2008
Now in the real world, it's hard to understand that the operator //
should be used instead of /. So timedelta()/int might be an alias to
timedelta()//int.
tebeka commentedon Mar 18, 2010
I see the same problem when "from __future__ import division" on the 2.x series. Seem like the timedelta objects is missing the __truediv__ method.
l0nwlf commentedon Mar 31, 2010
I do not understand why python2.7 is marked in Version tag ?
I reproduced the error on 3.1 but no isues on 2.7
tebeka commentedon Mar 31, 2010
It's marked on 2.7 due to the following (this is svn 79528)
AlexanderBelopolsky commentedon Apr 20, 2010
This is certainly not a bug, so I don't think targeting 2.7 is appropriate. I have explained in a comment on bpo-2706 (see msg75917) why I believe true division of timedelta by int should not be supported. In short, true division of timedelta by int is supposed to return fractional number of microseconds, but python lacks a type that can represent it.
mdickinson commentedon Apr 20, 2010
I think it's fine to do the division and round the result to the nearest whole number of microseconds. I don't see any good reason for disallowing timedelta / int (or even timedelta / float).
smontanaro commentedon Apr 20, 2010
Mark> I think it's fine to do the division and round the result to the
Mark> nearest whole number of microseconds.
Right. Just think of a timedelta as a floating point number of seconds with
very limited precision (1e-6 seconds).
abalkin commentedon Jun 6, 2010
Closing as duplicate of bpo-1289118. Division of timedelta by integer is supported in py3k since r81625.