classification
Title: file.readline: bad exception recovery
Type: behavior Stage:
Components: Interpreter Core Versions: Python 3.0
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: benjamin.peterson Nosy List: ajaksu2, benjamin.peterson, gvanrossum, terry.reedy
Priority: high Keywords: easy, patch

Created on 2008-08-07 22:36 by terry.reedy, last changed 2009-04-24 23:00 by benjamin.peterson. This issue is now closed.

Files
File name Uploaded Description Edit
file.readline.diff ajaksu2, 2008-08-27 23:00 Adds isinstance(limit, int) to io.X.readline
Messages (5)
msg70866 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2008-08-07 22:36
WinXP, 3.0b2
>>>f=open('somefile', 'r')
>>>f.readline(somefloat)
Traceback (most recent call last):
  File "<pyshell#70>", line 1, in <module>
    f.readline(1.0)
  File "C:\Program Files\Python30\lib\io.py", line 1766, in readline
    return line[:endpos]
TypeError: slice indices must be integers or None or have an __index__
method

At this point, any f.read or f.readline calls fail with a similar
TypeError.  The error recovery seems incomplete.  The same does *not*
happen with f.read(float).  Recovery is complete and subsequent
f.read/f.readline calls work.

In 2.5, float size arg worked with a deprecation warning, so issue does
not arise.  I presume same is true in 2.6.
msg70867 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2008-08-07 22:53
Good catch!

This looks pretty simple to fix; I think a type check is missing
(actually several, there are at least two implementations in io.py).

In fact, the 2.6 version of io.py already has the necessary checks. 
(But merging those forward is not 100% trivial since in 3.0 the 'long'
type doesn't exist.)
msg72049 - (view) Author: Daniel Diniz (ajaksu2) Date: 2008-08-27 23:00
Patch attached, suggested test below.

def test_readline():
    for mode in ('r', 'rb', 'r+', 'r+b'):
        f = open(__file__, mode)
        try:
            f.readline(0.1)
        except TypeError:
            tmp = f.readline()
        f.close()
    print('OK')

test_readline()
msg81364 - (view) Author: Daniel Diniz (ajaksu2) Date: 2009-02-08 03:24
Maybe this one should be in 3.0.1? Benchmarking the isinstance approach
against int() would be interesting.

The io-c branch doesn't have this bug, so 3.1 is OK :)
msg86437 - (view) Author: Benjamin Peterson (benjamin.peterson) * (Python committer) Date: 2009-04-24 23:00
Fixed in r71855
History
Date User Action Args
2009-04-24 23:00:33benjamin.petersonsetstatus: open -> closed
resolution: fixed
messages: + msg86437
2009-04-22 18:58:17benjamin.petersonsetpriority: high
assignee: benjamin.peterson

nosy: + benjamin.peterson
2009-02-08 03:24:34ajaksu2setmessages: + msg81364
2008-08-27 23:00:32ajaksu2setfiles: + file.readline.diff
nosy: + ajaksu2
messages: + msg72049
keywords: + patch
2008-08-07 22:53:35gvanrossumsetkeywords: + easy
nosy: + gvanrossum
messages: + msg70867
2008-08-07 22:36:50terry.reedycreate