Skip to content

Commit 0554d83

Browse files
Issue python#15068: Avoid creating a reference loop in fileinput.
1 parent 4a6f482 commit 0554d83

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

Lib/fileinput.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,6 @@ def __init__(self, files=None, inplace=False, backup="", bufsize=0,
207207
self._startlineno = 0
208208
self._filelineno = 0
209209
self._file = None
210-
self._readline = self._start_readline
211210
self._isstdin = False
212211
self._backupfilename = None
213212
# restrict mode argument to reading modes
@@ -245,15 +244,15 @@ def __iter__(self):
245244
return self
246245

247246
def __next__(self):
248-
line = self._readline()
249-
if line:
250-
self._filelineno += 1
251-
return line
252-
if not self._file:
253-
raise StopIteration
254-
self.nextfile()
255-
# Recursive call
256-
return self.__next__()
247+
while True:
248+
line = self._readline()
249+
if line:
250+
self._filelineno += 1
251+
return line
252+
if not self._file:
253+
raise StopIteration
254+
self.nextfile()
255+
# repeat with next file
257256

258257
def __getitem__(self, i):
259258
if i != self.lineno():
@@ -277,7 +276,10 @@ def nextfile(self):
277276
finally:
278277
file = self._file
279278
self._file = None
280-
self._readline = self._start_readline
279+
try:
280+
del self._readline # restore FileInput._readline
281+
except AttributeError:
282+
pass
281283
try:
282284
if file and not self._isstdin:
283285
file.close()
@@ -301,7 +303,7 @@ def readline(self):
301303
self.nextfile()
302304
# repeat with next file
303305

304-
def _start_readline(self):
306+
def _readline(self):
305307
if not self._files:
306308
if 'b' in self._mode:
307309
return b''
@@ -356,7 +358,7 @@ def _start_readline(self):
356358
self._file = self._openhook(self._filename, self._mode)
357359
else:
358360
self._file = open(self._filename, self._mode)
359-
self._readline = self._file.readline
361+
self._readline = self._file.readline # hide FileInput._readline
360362
return self._readline()
361363

362364
def filename(self):

0 commit comments

Comments
 (0)