]> granicus.if.org Git - python/commitdiff
bpo-30432: FileInput doesn't accept PathLike objects for file names (#1732)
authorRoy Williams <roy.williams.iii@gmail.com>
Tue, 23 May 2017 05:24:17 +0000 (22:24 -0700)
committerŁukasz Langa <lukasz@langa.pl>
Tue, 23 May 2017 05:24:17 +0000 (22:24 -0700)
* Allow FileInput to accept a single PathLike object as a parameter for `files`

Fixes

bpo-30432: FileInput doesn't accept PathLike objects for file names

* Address comments from @ambv

Lib/fileinput.py
Lib/test/test_fileinput.py

index 721fe9c9612c17698ee939c900c2bedf7e59c3f5..363c241c50e988ea6740859b564c747ae0ddb08f 100644 (file)
@@ -189,6 +189,8 @@ class FileInput:
                  mode="r", openhook=None):
         if isinstance(files, str):
             files = (files,)
+        elif isinstance(files, os.PathLike):
+            files = (os.fspath(files), )
         else:
             if files is None:
                 files = sys.argv[1:]
index 565633fcccd97c61a240387906a0c05abb6b1be2..5df810c8f999b831491ed0c14006e8027a347502 100644 (file)
@@ -21,6 +21,7 @@ except ImportError:
 
 from io import BytesIO, StringIO
 from fileinput import FileInput, hook_encoded
+from pathlib import Path
 
 from test.support import verbose, TESTFN, check_warnings
 from test.support import unlink as safe_unlink
@@ -530,6 +531,20 @@ class FileInputTests(unittest.TestCase):
             self.assertRaises(StopIteration, next, fi)
             self.assertEqual(src.linesread, [])
 
+    def test_pathlib_file(self):
+        t1 = None
+        try:
+            t1 = Path(writeTmp(1, ["Pathlib file."]))
+            with FileInput(t1) as fi:
+                line = fi.readline()
+                self.assertEqual(line, 'Pathlib file.')
+                self.assertEqual(fi.lineno(), 1)
+                self.assertEqual(fi.filelineno(), 1)
+                self.assertEqual(fi.filename(), os.fspath(t1))
+        finally:
+            remove_tempfiles(t1)
+
+
 class MockFileInput:
     """A class that mocks out fileinput.FileInput for use during unit tests"""