diff options
author | Hongyang Peng <penghongyang@megvii.com> | 2023-05-09 18:09:39 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-09 12:09:39 +0200 |
commit | 181c15b294d6dd164e4c41ddbb1c5feae9b5beee (patch) | |
tree | 1dca1fb9e52cf9a4dd6d8ffe596a7287a427a5a3 | |
parent | c86cdefead454b4d131cfbee6d6a09ead272d9f5 (diff) | |
download | numpy-181c15b294d6dd164e4c41ddbb1c5feae9b5beee.tar.gz |
BUG: fix the method for checking local files (#23728)
BufferedReader and BufferedWriter cannot be used to determine local
files. For example, users can implement CustomFile to operate on OSS
files, and then use BufferedReader(CustomFile) to achieve the buffered
effect. But fileno method can do it.
-rw-r--r-- | numpy/compat/py3k.py | 10 | ||||
-rw-r--r-- | numpy/compat/tests/test_compat.py | 3 |
2 files changed, 12 insertions, 1 deletions
diff --git a/numpy/compat/py3k.py b/numpy/compat/py3k.py index 3d10bb988..d02c9f8fe 100644 --- a/numpy/compat/py3k.py +++ b/numpy/compat/py3k.py @@ -47,7 +47,15 @@ def asstr(s): return str(s) def isfileobj(f): - return isinstance(f, (io.FileIO, io.BufferedReader, io.BufferedWriter)) + if not isinstance(f, (io.FileIO, io.BufferedReader, io.BufferedWriter)): + return False + try: + # BufferedReader/Writer may raise OSError when + # fetching `fileno()` (e.g. when wrapping BytesIO). + f.fileno() + return True + except OSError: + return False def open_latin1(filename, mode='r'): return open(filename, mode=mode, encoding='iso-8859-1') diff --git a/numpy/compat/tests/test_compat.py b/numpy/compat/tests/test_compat.py index 2b8acbaa0..d4391565e 100644 --- a/numpy/compat/tests/test_compat.py +++ b/numpy/compat/tests/test_compat.py @@ -1,4 +1,5 @@ from os.path import join +from io import BufferedReader, BytesIO from numpy.compat import isfileobj from numpy.testing import assert_ @@ -17,3 +18,5 @@ def test_isfileobj(): with open(filename, 'rb') as f: assert_(isfileobj(f)) + + assert_(isfileobj(BufferedReader(BytesIO())) is False) |