#22709: Use stdin as-is if it does not have a buffer attribute.

This restores backward compatibility lost in the fix for #21075, and
is better duck typing.

Patch by Akira Li.
This commit is contained in:
R David Murray 2016-01-02 15:41:41 -05:00
parent fcb6db50d3
commit 830207e8f3
3 changed files with 15 additions and 1 deletions

View file

@ -328,7 +328,7 @@ class FileInput:
if self._filename == '-': if self._filename == '-':
self._filename = '<stdin>' self._filename = '<stdin>'
if 'b' in self._mode: if 'b' in self._mode:
self._file = sys.stdin.buffer self._file = getattr(sys.stdin, 'buffer', sys.stdin)
else: else:
self._file = sys.stdin self._file = sys.stdin
self._isstdin = True self._isstdin = True

View file

@ -240,6 +240,17 @@ class FileInputTests(unittest.TestCase):
lines = list(fi) lines = list(fi)
self.assertEqual(lines, [b'spam, bacon, sausage, and spam']) self.assertEqual(lines, [b'spam, bacon, sausage, and spam'])
def test_detached_stdin_binary_mode(self):
orig_stdin = sys.stdin
try:
sys.stdin = BytesIO(b'spam, bacon, sausage, and spam')
self.assertFalse(hasattr(sys.stdin, 'buffer'))
fi = FileInput(files=['-'], mode='rb')
lines = list(fi)
self.assertEqual(lines, [b'spam, bacon, sausage, and spam'])
finally:
sys.stdin = orig_stdin
def test_file_opening_hook(self): def test_file_opening_hook(self):
try: try:
# cannot use openhook and inplace mode # cannot use openhook and inplace mode

View file

@ -41,6 +41,9 @@ Core and Builtins
Library Library
------- -------
- Issue #25447: fileinput now uses sys.stdin as-is if it does not have a
buffer attribute (restores backward compatibility).
- Issue #25447: Copying the lru_cache() wrapper object now always works, - Issue #25447: Copying the lru_cache() wrapper object now always works,
independedly from the type of the wrapped object (by returning the original independedly from the type of the wrapped object (by returning the original
object unchanged). object unchanged).