summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2016-07-25 15:07:18 -0500
committerGitHub <noreply@github.com>2016-07-25 15:07:18 -0500
commiteb2c1db5fb9c874b12360721e60d856f03fa0176 (patch)
treea7c3b3222945bb617e1ec7b322146dbdacd5cdfd
parent1b16cd8762ef2bc046613f99bc4f1556697ed274 (diff)
parentb9b42ee958db9882c6490311aa47395b4b5e5922 (diff)
downloadnumpy-eb2c1db5fb9c874b12360721e60d856f03fa0176.tar.gz
Merge pull request #7853 from charris/fix-novalue-import
BUG: Make sure numpy globals keep identity after reload.
-rw-r--r--numpy/__init__.py27
-rw-r--r--numpy/tests/test_reloading.py26
2 files changed, 44 insertions, 9 deletions
diff --git a/numpy/__init__.py b/numpy/__init__.py
index b05157c4a..4be750c19 100644
--- a/numpy/__init__.py
+++ b/numpy/__init__.py
@@ -107,8 +107,21 @@ Exceptions to this rule are documented.
from __future__ import division, absolute_import, print_function
import sys
+import warnings
+# Disallow reloading numpy. Doing that does nothing to change previously
+# loaded modules, which would need to be reloaded separately, but it does
+# change the identity of the warnings and sentinal classes defined below
+# with dire consequences when checking for identity.
+if '_is_loaded' in globals():
+ raise RuntimeError('Reloading numpy is not supported')
+_is_loaded = True
+
+# Define some global warnings and the _NoValue sentinal. Defining them here
+# means that their identity will change if numpy is reloaded, hence if that is
+# to be allowed they should be moved into their own, non-reloadable module.
+# Note that these should be defined (or imported) before the other imports.
class ModuleDeprecationWarning(DeprecationWarning):
"""Module deprecation warning.
@@ -135,9 +148,8 @@ class VisibleDeprecationWarning(UserWarning):
class _NoValue:
"""Special keyword value.
- This class may be used as the default value assigned to a
- deprecated keyword in order to check if it has been given a user
- defined value.
+ This class may be used as the default value assigned to a deprecated
+ keyword in order to check if it has been given a user defined value.
"""
pass
@@ -155,11 +167,8 @@ try:
except NameError:
__NUMPY_SETUP__ = False
-
if __NUMPY_SETUP__:
- import sys as _sys
- _sys.stderr.write('Running from numpy source directory.\n')
- del _sys
+ sys.stderr.write('Running from numpy source directory.\n')
else:
try:
from numpy.__config__ import show as show_config
@@ -209,7 +218,7 @@ else:
from .compat import long
# Make these accessible from numpy name-space
- # but not imported in from numpy import *
+ # but not imported in from numpy import *
if sys.version_info[0] >= 3:
from builtins import bool, int, float, complex, object, str
unicode = str
@@ -225,8 +234,8 @@ else:
__all__.extend(lib.__all__)
__all__.extend(['linalg', 'fft', 'random', 'ctypeslib', 'ma'])
+
# Filter annoying Cython warnings that serve no good purpose.
- import warnings
warnings.filterwarnings("ignore", message="numpy.dtype size changed")
warnings.filterwarnings("ignore", message="numpy.ufunc size changed")
warnings.filterwarnings("ignore", message="numpy.ndarray size changed")
diff --git a/numpy/tests/test_reloading.py b/numpy/tests/test_reloading.py
new file mode 100644
index 000000000..141e11f6c
--- /dev/null
+++ b/numpy/tests/test_reloading.py
@@ -0,0 +1,26 @@
+from __future__ import division, absolute_import, print_function
+
+import sys
+
+import numpy as np
+from numpy.testing import assert_raises, assert_, run_module_suite
+
+if sys.version_info[:2] >= (3, 4):
+ from importlib import reload
+else:
+ from imp import reload
+
+def test_reloading_exception():
+ # gh-7844. Also check that relevant globals retain their identity.
+ _NoValue = np._NoValue
+ VisibleDeprecationWarning = np.VisibleDeprecationWarning
+ ModuleDeprecationWarning = np.ModuleDeprecationWarning
+
+ assert_raises(RuntimeError, reload, np)
+ assert_(_NoValue is np._NoValue)
+ assert_(ModuleDeprecationWarning is np.ModuleDeprecationWarning)
+ assert_(VisibleDeprecationWarning is np.VisibleDeprecationWarning)
+
+
+if __name__ == "__main__":
+ run_module_suite()