Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit aadaa36

Browse files
Issue #15068: Avoid creating a reference loop in fileinput.
2 parents 39f57ca + 0554d83 commit aadaa36

1 file changed

Lines changed: 15 additions & 13 deletions

File tree

Lib/fileinput.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,6 @@ def __init__(self, files=None, inplace=False, backup="", bufsize=0,
209209
self._startlineno = 0
210210
self._filelineno = 0
211211
self._file = None
212-
self._readline = self._start_readline
213212
self._isstdin = False
214213
self._backupfilename = None
215214
# restrict mode argument to reading modes
@@ -247,15 +246,15 @@ def __iter__(self):
247246
return self
248247

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

260259
def __getitem__(self, i):
261260
if i != self.lineno():
@@ -279,7 +278,10 @@ def nextfile(self):
279278
finally:
280279
file = self._file
281280
self._file = None
282-
self._readline = self._start_readline
281+
try:
282+
del self._readline # restore FileInput._readline
283+
except AttributeError:
284+
pass
283285
try:
284286
if file and not self._isstdin:
285287
file.close()
@@ -303,7 +305,7 @@ def readline(self):
303305
self.nextfile()
304306
# repeat with next file
305307

306-
def _start_readline(self):
308+
def _readline(self):
307309
if not self._files:
308310
if 'b' in self._mode:
309311
return b''
@@ -358,7 +360,7 @@ def _start_readline(self):
358360
self._file = self._openhook(self._filename, self._mode)
359361
else:
360362
self._file = open(self._filename, self._mode)
361-
self._readline = self._file.readline
363+
self._readline = self._file.readline # hide FileInput._readline
362364
return self._readline()
363365

364366
def filename(self):

0 commit comments

Comments
 (0)