classification
Title: file.readline: bad exception recovery
Type: behavior Stage:
Components: Interpreter Core Versions: Python 3.0
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: ajaksu2, gvanrossum, tjreedy
Priority: Keywords: easy, patch

Created on 2008-08-07 22:36 by tjreedy, last changed 2008-08-27 23:00 by ajaksu2.

Files
File name Uploaded Description Edit Remove
file.readline.diff ajaksu2, 2008-08-27 23:00 Adds isinstance(limit, int) to io.X.readline
Messages
msg70866 (view) Author: Terry J. Reedy (tjreedy) 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) 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()
History
Date User Action Args
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:50tjreedycreate