summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Schult <dschult@colgate.edu>2022-07-27 09:05:58 -0400
committerGitHub <noreply@github.com>2022-07-27 15:05:58 +0200
commit6e1557900da3c2cc8455449e7e76b07f7c36b32a (patch)
tree34e42004c1a8b74dc2f444b13e783ba758164019
parent45bc13e6d922690eea43b9d807d476e0f243f836 (diff)
downloadnumpy-6e1557900da3c2cc8455449e7e76b07f7c36b32a.tar.gz
ENH: allow importlib.LazyLoader to work with numpy and add test of this (#22045)
-rw-r--r--numpy/core/__init__.py2
-rw-r--r--numpy/lib/__init__.py18
-rw-r--r--numpy/matrixlib/__init__.py1
-rw-r--r--numpy/testing/__init__.py1
-rw-r--r--numpy/tests/test_lazyloading.py38
5 files changed, 60 insertions, 0 deletions
diff --git a/numpy/core/__init__.py b/numpy/core/__init__.py
index b89e27f0f..748705e33 100644
--- a/numpy/core/__init__.py
+++ b/numpy/core/__init__.py
@@ -75,8 +75,10 @@ from .numeric import *
from . import fromnumeric
from .fromnumeric import *
from . import defchararray as char
+from . import records
from . import records as rec
from .records import record, recarray, format_parser
+# Note: module name memmap is overwritten by a class with same name
from .memmap import *
from .defchararray import chararray
from . import function_base
diff --git a/numpy/lib/__init__.py b/numpy/lib/__init__.py
index ad88ba347..58166d4b1 100644
--- a/numpy/lib/__init__.py
+++ b/numpy/lib/__init__.py
@@ -21,6 +21,24 @@ from . import mixins
from . import scimath as emath
# Private submodules
+# load module names. See https://github.com/networkx/networkx/issues/5838
+from . import type_check
+from . import index_tricks
+from . import function_base
+from . import nanfunctions
+from . import shape_base
+from . import stride_tricks
+from . import twodim_base
+from . import ufunclike
+from . import histograms
+from . import polynomial
+from . import utils
+from . import arraysetops
+from . import npyio
+from . import arrayterator
+from . import arraypad
+from . import _version
+
from .type_check import *
from .index_tricks import *
from .function_base import *
diff --git a/numpy/matrixlib/__init__.py b/numpy/matrixlib/__init__.py
index 54154d11f..8a7597d30 100644
--- a/numpy/matrixlib/__init__.py
+++ b/numpy/matrixlib/__init__.py
@@ -1,6 +1,7 @@
"""Sub-package containing the matrix class and related functions.
"""
+from . import defmatrix
from .defmatrix import *
__all__ = defmatrix.__all__
diff --git a/numpy/testing/__init__.py b/numpy/testing/__init__.py
index 6e06c5b49..087527e43 100644
--- a/numpy/testing/__init__.py
+++ b/numpy/testing/__init__.py
@@ -7,6 +7,7 @@ away.
"""
from unittest import TestCase
+from . import _private
from ._private.utils import *
from ._private.utils import (_assert_valid_refcount, _gen_alignment_data)
from ._private import extbuild, decorators as dec
diff --git a/numpy/tests/test_lazyloading.py b/numpy/tests/test_lazyloading.py
new file mode 100644
index 000000000..f31a4eab7
--- /dev/null
+++ b/numpy/tests/test_lazyloading.py
@@ -0,0 +1,38 @@
+import sys
+import importlib
+from importlib.util import LazyLoader, find_spec, module_from_spec
+import pytest
+
+
+# Warning raised by _reload_guard() in numpy/__init__.py
+@pytest.mark.filterwarnings("ignore:The NumPy module was reloaded")
+def test_lazy_load():
+ # gh-22045. lazyload doesn't import submodule names into the namespace
+ # muck with sys.modules to test the importing system
+ old_numpy = sys.modules.pop("numpy")
+
+ numpy_modules = {}
+ for mod_name, mod in list(sys.modules.items()):
+ if mod_name[:6] == "numpy.":
+ numpy_modules[mod_name] = mod
+ sys.modules.pop(mod_name)
+
+ try:
+ # create lazy load of numpy as np
+ spec = find_spec("numpy")
+ module = module_from_spec(spec)
+ sys.modules["numpy"] = module
+ loader = LazyLoader(spec.loader)
+ loader.exec_module(module)
+ np = module
+
+ # test a subpackage import
+ from numpy.lib import recfunctions
+
+ # test triggering the import of the package
+ np.ndarray
+
+ finally:
+ if old_numpy:
+ sys.modules["numpy"] = old_numpy
+ sys.modules.update(numpy_modules)