Issue 1083: Confusing error message when dividing timedelta using /
Created on 2007-09-01 19:19 by skip.montanaro, last changed 2022-04-11 14:56 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| py3k_datetime_1083.patch | christian.heimes, 2007-11-21 10:36 | |||
| Messages (10) | |||
|---|---|---|---|
| msg55566 - (view) | Author: Skip Montanaro (skip.montanaro) * ![]() |
Date: 2007-09-01 19:19 | |
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? |
|||
| msg55904 - (view) | Author: Brett Cannon (brett.cannon) * ![]() |
Date: 2007-09-14 00:10 | |
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. |
|||
| msg75725 - (view) | Author: STINNER Victor (vstinner) * ![]() |
Date: 2008-11-11 03:22 | |
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. |
|||
| msg101281 - (view) | Author: Miki Tebeka (tebeka) * | Date: 2010-03-18 21:01 | |
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. |
|||
| msg101969 - (view) | Author: Shashwat Anand (l0nwlf) | Date: 2010-03-31 01:14 | |
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) >>> |
|||
| msg102006 - (view) | Author: Miki Tebeka (tebeka) * | Date: 2010-03-31 13:46 | |
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' >>> |
|||
| msg103725 - (view) | Author: Alexander Belopolsky (Alexander.Belopolsky) | Date: 2010-04-20 15:28 | |
This is certainly not a bug, so I don't think targeting 2.7 is appropriate. I have explained in a comment on issue2706 (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. |
|||
| msg103771 - (view) | Author: Mark Dickinson (mark.dickinson) * ![]() |
Date: 2010-04-20 21:37 | |
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). |
|||
| msg103778 - (view) | Author: Skip Montanaro (skip.montanaro) * ![]() |
Date: 2010-04-20 21:52 | |
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).
|
|||
| msg107170 - (view) | Author: Alexander Belopolsky (belopolsky) * ![]() |
Date: 2010-06-06 01:25 | |
Closing as duplicate of issue1289118. Division of timedelta by integer is supported in py3k since r81625. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022-04-11 14:56:26 | admin | set | github: 45424 |
| 2010-06-06 01:25:31 | belopolsky | set | status: open -> closed superseder: timedelta multiply and divide by floating point messages: + msg107170 nosy:
+ belopolsky, - Alexander.Belopolsky |
| 2010-05-20 20:38:12 | skip.montanaro | set | nosy:
- skip.montanaro |
| 2010-04-20 21:52:09 | skip.montanaro | set | messages: + msg103778 |
| 2010-04-20 21:38:56 | mark.dickinson | set | type: behavior -> enhancement versions: + Python 3.2, - Python 3.0, Python 2.7 |
| 2010-04-20 21:37:47 | mark.dickinson | set | nosy:
+ mark.dickinson messages: + msg103771 |
| 2010-04-20 15:28:16 | Alexander.Belopolsky | set | nosy:
+ Alexander.Belopolsky messages: + msg103725 |
| 2010-03-31 13:46:34 | tebeka | set | messages: + msg102006 |
| 2010-03-31 01:14:23 | l0nwlf | set | nosy:
+ l0nwlf messages: + msg101969 |
| 2010-03-18 21:01:55 | tebeka | set | nosy:
+ tebeka messages:
+ msg101281 |
| 2008-11-20 16:28:43 | webograph | set | nosy: + webograph |
| 2008-11-11 03:22:57 | vstinner | set | nosy:
+ vstinner messages: + msg75725 |
| 2008-01-06 22:29:45 | admin | set | keywords:
- py3k versions: Python 3.0 |
| 2007-11-21 10:36:56 | christian.heimes | set | keywords:
+ patch files: + py3k_datetime_1083.patch |
| 2007-09-18 12:09:46 | jafo | set | priority: normal |
| 2007-09-14 00:10:16 | brett.cannon | set | nosy:
+ brett.cannon messages: + msg55904 |
| 2007-09-13 23:59:28 | brett.cannon | set | keywords:
+ py3k versions: + Python 3.0 |
| 2007-09-01 19:19:34 | skip.montanaro | create | |

