-
-
Notifications
You must be signed in to change notification settings - Fork 30k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Confusing error message when dividing timedelta using / #45424
Comments
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 >>> d // 2
datetime.timedelta(0, 43200) Is there some way the error message can be improved, |
If you set nb_true_div on timedelta objects to delta_divide (just like But it might make sense to only set it on nb_true_div as the division |
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 // |
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. |
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)
>>> |
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'
>>> |
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). |
Mark> I think it's fine to do the division and round the result to the Right. Just think of a timedelta as a floating point number of seconds with |
Closing as duplicate of bpo-1289118. Division of timedelta by integer is supported in py3k since r81625. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: