diff options
author | Charles Harris <charlesr.harris@gmail.com> | 2016-07-25 15:07:18 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-07-25 15:07:18 -0500 |
commit | eb2c1db5fb9c874b12360721e60d856f03fa0176 (patch) | |
tree | a7c3b3222945bb617e1ec7b322146dbdacd5cdfd | |
parent | 1b16cd8762ef2bc046613f99bc4f1556697ed274 (diff) | |
parent | b9b42ee958db9882c6490311aa47395b4b5e5922 (diff) | |
download | numpy-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__.py | 27 | ||||
-rw-r--r-- | numpy/tests/test_reloading.py | 26 |
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() |