r83359 - in python/branches/py3k: Doc/library/fileinput.rst Lib/fileinput.py Lib/test/test_fileinput.py Misc/NEWS
Author: georg.brandl Date: Sat Jul 31 22:08:15 2010 New Revision: 83359 Log: #1286: allow using fileinput.FileInput as context manager. Modified: python/branches/py3k/Doc/library/fileinput.rst python/branches/py3k/Lib/fileinput.py python/branches/py3k/Lib/test/test_fileinput.py python/branches/py3k/Misc/NEWS Modified: python/branches/py3k/Doc/library/fileinput.rst ============================================================================== --- python/branches/py3k/Doc/library/fileinput.rst (original) +++ python/branches/py3k/Doc/library/fileinput.rst Sat Jul 31 22:08:15 2010 @@ -24,7 +24,7 @@ All files are opened in text mode by default, but you can override this by specifying the *mode* parameter in the call to :func:`.input` or -:class:`FileInput()`. If an I/O error occurs during opening or reading a file, +:class:`FileInput`. If an I/O error occurs during opening or reading a file, :exc:`IOError` is raised. If ``sys.stdin`` is used more than once, the second and further use will return @@ -54,6 +54,16 @@ during iteration. The parameters to this function will be passed along to the constructor of the :class:`FileInput` class. + The :class:`FileInput` instance can be used as a context manager in the + :keyword:`with` statement. In this example, *input* is closed after the + :keyword:`with` statement is exited, even if an exception occurs:: + + with fileinput.input(files=('spam.txt', 'eggs.txt')) as input: + process(input) + + .. versionchanged:: 3.2 + Can be used as a context manager. + The following functions use the global state created by :func:`fileinput.input`; if there is no active state, :exc:`RuntimeError` is raised. @@ -132,13 +142,23 @@ *filename* and *mode*, and returns an accordingly opened file-like object. You cannot use *inplace* and *openhook* together. - -**Optional in-place filtering:** if the keyword argument ``inplace=1`` is passed -to :func:`fileinput.input` or to the :class:`FileInput` constructor, the file is -moved to a backup file and standard output is directed to the input file (if a -file of the same name as the backup file already exists, it will be replaced -silently). This makes it possible to write a filter that rewrites its input -file in place. If the *backup* parameter is given (typically as + A :class:`FileInput` instance can be used as a context manager in the + :keyword:`with` statement. In this example, *input* is closed after the + :keyword:`with` statement is exited, even if an exception occurs:: + + with FileInput(files=('spam.txt', 'eggs.txt')) as input: + process(input) + + .. versionchanged:: 3.2 + Can be used as a context manager. + + +**Optional in-place filtering:** if the keyword argument ``inplace=True`` is +passed to :func:`fileinput.input` or to the :class:`FileInput` constructor, the +file is moved to a backup file and standard output is directed to the input file +(if a file of the same name as the backup file already exists, it will be +replaced silently). This makes it possible to write a filter that rewrites its +input file in place. If the *backup* parameter is given (typically as ``backup='.<some extension>'``), it specifies the extension for the backup file, and the backup file remains around; by default, the extension is ``'.bak'`` and it is deleted when the output file is closed. In-place filtering is disabled Modified: python/branches/py3k/Lib/fileinput.py ============================================================================== --- python/branches/py3k/Lib/fileinput.py (original) +++ python/branches/py3k/Lib/fileinput.py Sat Jul 31 22:08:15 2010 @@ -238,6 +238,12 @@ self.nextfile() self._files = () + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + self.close() + def __iter__(self): return self Modified: python/branches/py3k/Lib/test/test_fileinput.py ============================================================================== --- python/branches/py3k/Lib/test/test_fileinput.py (original) +++ python/branches/py3k/Lib/test/test_fileinput.py Sat Jul 31 22:08:15 2010 @@ -231,6 +231,30 @@ ## finally: ## remove_tempfiles(t1) + def test_context_manager(self): + try: + t1 = writeTmp(1, ["A\nB\nC"]) + t2 = writeTmp(2, ["D\nE\nF"]) + with FileInput(files=(t1, t2)) as fi: + lines = list(fi) + self.assertEqual(lines, ["A\n", "B\n", "C", "D\n", "E\n", "F"]) + self.assertEqual(fi.filelineno(), 3) + self.assertEqual(fi.lineno(), 6) + self.assertEqual(fi._files, ()) + finally: + remove_tempfiles(t1, t2) + + def test_close_on_exception(self): + try: + t1 = writeTmp(1, [""]) + with FileInput(files=t1) as fi: + raise IOError + except IOError: + self.assertEqual(fi._files, ()) + finally: + remove_tempfiles(t1) + + def test_main(): run_unittest(BufferSizesTests, FileInputTests) Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Sat Jul 31 22:08:15 2010 @@ -15,6 +15,8 @@ Library ------- +- Issue #1286: Allow using fileinput.FileInput as a context manager. + - Add lfu_cache() and lru_cache() decorators to the functools module.
participants (1)
-
georg.brandl