homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Confusing error message when dividing timedelta using /
Type: enhancement Stage:
Components: Interpreter Core Versions: Python 3.2
process
Status: closed Resolution: duplicate
Dependencies: Superseder: timedelta multiply and divide by floating point
View: 1289118
Assigned To: Nosy List: belopolsky, brett.cannon, l0nwlf, mark.dickinson, tebeka, vstinner, webograph
Priority: normal Keywords: patch

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) * (Python triager) 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) * (Python committer) 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) * (Python committer) 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) * (Python committer) 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) * (Python triager) 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) * (Python committer) 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:26adminsetgithub: 45424
2010年06月06日 01:25:31belopolskysetstatus: open -> closed
superseder: timedelta multiply and divide by floating point
messages: + msg107170

nosy: + belopolsky, - Alexander.Belopolsky
resolution: duplicate
2010年05月20日 20:38:12skip.montanarosetnosy: - skip.montanaro
2010年04月20日 21:52:09skip.montanarosetmessages: + msg103778
2010年04月20日 21:38:56mark.dickinsonsettype: behavior -> enhancement
versions: + Python 3.2, - Python 3.0, Python 2.7
2010年04月20日 21:37:47mark.dickinsonsetnosy: + mark.dickinson
messages: + msg103771
2010年04月20日 15:28:16Alexander.Belopolskysetnosy: + Alexander.Belopolsky
messages: + msg103725
2010年03月31日 13:46:34tebekasetmessages: + msg102006
2010年03月31日 01:14:23l0nwlfsetnosy: + l0nwlf
messages: + msg101969
2010年03月18日 21:01:55tebekasetnosy: + tebeka

messages: + msg101281
versions: + Python 2.7
2008年11月20日 16:28:43webographsetnosy: + webograph
2008年11月11日 03:22:57vstinnersetnosy: + vstinner
messages: + msg75725
2008年01月06日 22:29:45adminsetkeywords: - py3k
versions: Python 3.0
2007年11月21日 10:36:56christian.heimessetkeywords: + patch
files: + py3k_datetime_1083.patch
2007年09月18日 12:09:46jafosetpriority: normal
2007年09月14日 00:10:16brett.cannonsetnosy: + brett.cannon
messages: + msg55904
2007年09月13日 23:59:28brett.cannonsetkeywords: + py3k
versions: + Python 3.0
2007年09月01日 19:19:34skip.montanarocreate

AltStyle によって変換されたページ (->オリジナル) /