summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHongyang Peng <penghongyang@megvii.com>2023-05-09 18:09:39 +0800
committerGitHub <noreply@github.com>2023-05-09 12:09:39 +0200
commit181c15b294d6dd164e4c41ddbb1c5feae9b5beee (patch)
tree1dca1fb9e52cf9a4dd6d8ffe596a7287a427a5a3
parentc86cdefead454b4d131cfbee6d6a09ead272d9f5 (diff)
downloadnumpy-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.py10
-rw-r--r--numpy/compat/tests/test_compat.py3
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)