diff options
Diffstat (limited to 'Lib')
| -rw-r--r-- | Lib/_pyio.py | 10 | ||||
| -rw-r--r-- | Lib/test/test_io.py | 9 |
2 files changed, 17 insertions, 2 deletions
diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 3bd35d2..39c1717 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -27,7 +27,7 @@ BlockingIOError = BlockingIOError def open(file, mode="r", buffering=-1, encoding=None, errors=None, - newline=None, closefd=True): + newline=None, closefd=True, opener=None): r"""Open file and return a stream. Raise IOError upon failure. @@ -122,6 +122,12 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None, be kept open when the file is closed. This does not work when a file name is given and must be True in that case. + A custom opener can be used by passing a callable as *opener*. The + underlying file descriptor for the file object is then obtained by calling + *opener* with (*file*, *flags*). *opener* must return an open file + descriptor (passing os.open as *opener* results in functionality similar to + passing None). + open() returns a file object whose type depends on the mode, and through which the standard file operations such as reading and writing are performed. When open() is used to open a file in a text mode ('w', @@ -176,7 +182,7 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None, (writing and "w" or "") + (appending and "a" or "") + (updating and "+" or ""), - closefd) + closefd, opener=opener) line_buffering = False if buffering == 1 or buffering < 0 and raw.isatty(): buffering = -1 diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 0debc80..318f7a7 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -621,6 +621,15 @@ class IOTest(unittest.TestCase): for obj in test: self.assertTrue(hasattr(obj, "__dict__")) + def test_opener(self): + with self.open(support.TESTFN, "w") as f: + f.write("egg\n") + fd = os.open(support.TESTFN, os.O_RDONLY) + def opener(path, flags): + return fd + with self.open("non-existent", "r", opener=opener) as f: + self.assertEqual(f.read(), "egg\n") + class CIOTest(IOTest): def test_IOBase_finalize(self): |
