From 67e9fb9d7afbd9935322420a7cadd4cb6538dcdf Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sun, 19 Feb 2006 13:56:17 +0000 Subject: [PATCH] Patch #1215184: fileinput now has a fileno() function for getting the current file number. --- Doc/lib/libfileinput.tex | 15 +++++++++++---- Lib/fileinput.py | 24 +++++++++++++++++++++--- Lib/test/test_fileinput.py | 16 ++++++++++++++++ Misc/NEWS | 3 +++ 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/Doc/lib/libfileinput.tex b/Doc/lib/libfileinput.tex index cd20f99f1ed..b6186dcf7a7 100644 --- a/Doc/lib/libfileinput.tex +++ b/Doc/lib/libfileinput.tex @@ -62,6 +62,12 @@ The following functions use the global state created by line has been read, returns \code{None}. \end{funcdesc} +\begin{funcdesc}{fileno}{} + Return the integer ``file descriptor'' for the current file. When no + file is opened (before the first line and between files), returns + \code{-1}. +\end{funcdesc} + \begin{funcdesc}{lineno}{} Return the cumulative line number of the line that has just been read. Before the first line has been read, returns \code{0}. After @@ -107,10 +113,11 @@ module is available for subclassing as well: \begin{classdesc}{FileInput}{\optional{files\optional{, inplace\optional{, backup}}}} Class \class{FileInput} is the implementation; its methods - \method{filename()}, \method{lineno()}, \method{fileline()}, - \method{isfirstline()}, \method{isstdin()}, \method{nextfile()} and - \method{close()} correspond to the functions of the same name in the - module. In addition it has a \method{readline()} method which + \method{filename()}, \method{fileno()}, \method{lineno()}, + \method{fileline()}, \method{isfirstline()}, \method{isstdin()}, + \method{nextfile()} and \method{close()} correspond to the functions + of the same name in the module. + In addition it has a \method{readline()} method which returns the next input line, and a \method{__getitem__()} method which implements the sequence behavior. The sequence must be accessed in strictly sequential order; random access and diff --git a/Lib/fileinput.py b/Lib/fileinput.py index 5c06627238c..692eeea0c79 100644 --- a/Lib/fileinput.py +++ b/Lib/fileinput.py @@ -73,7 +73,6 @@ XXX Possible additions: - optional getopt argument processing - specify open mode ('r' or 'rb') -- fileno() - isatty() - read(), read(size), even readlines() @@ -153,6 +152,15 @@ def filelineno(): raise RuntimeError, "no active input()" return _state.filelineno() +def fileno(): + """ + Return the file number of the current file. When no file is currently + opened, returns -1. + """ + if not _state: + raise RuntimeError, "no active input()" + return _state.fileno() + def isfirstline(): """ Returns true the line just read is the first line of its file, @@ -175,8 +183,9 @@ class FileInput: """class FileInput([files[, inplace[, backup]]]) Class FileInput is the implementation of the module; its methods - filename(), lineno(), fileline(), isfirstline(), isstdin(), nextfile() - and close() correspond to the functions of the same name in the module. + filename(), lineno(), fileline(), isfirstline(), isstdin(), fileno(), + nextfile() and close() correspond to the functions of the same name + in the module. In addition it has a readline() method which returns the next input line, and a __getitem__() method which implements the sequence behavior. The sequence must be accessed in strictly @@ -334,6 +343,15 @@ class FileInput: def filelineno(self): return self._filelineno + def fileno(self): + if self._file: + try: + return self._file.fileno() + except ValueError: + return -1 + else: + return -1 + def isfirstline(self): return self._filelineno == 1 diff --git a/Lib/test/test_fileinput.py b/Lib/test/test_fileinput.py index 285573cc8ec..be4cb8e87b2 100644 --- a/Lib/test/test_fileinput.py +++ b/Lib/test/test_fileinput.py @@ -167,3 +167,19 @@ try: verify(lines == ["A\n", "B"]) finally: remove_tempfiles(t1) + +if verbose: + print "16. fileno()" +try: + t1 = writeTmp(1, ["A\nB"]) + t2 = writeTmp(2, ["C\nD"]) + fi = FileInput(files=(t1, t2)) + verify(fi.fileno() == -1) + line = fi.next() + verify(fi.fileno() != -1) + fi.nextfile() + verify(fi.fileno() == -1) + line = list(fi) + verify(fi.fileno() == -1) +finally: + remove_tempfiles(t1, t2) diff --git a/Misc/NEWS b/Misc/NEWS index 95d13ba0349..2ef34245739 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -366,6 +366,9 @@ Extension Modules Library ------- +- Patch #1215184: fileinput now has a fileno() function for getting the + current file number. + - Patch #1349274: gettext.install() now optionally installs additional translation functions other than _() in the builtin namespace.