113 lines
3.9 KiB
Python
113 lines
3.9 KiB
Python
|
import unittest
|
||
|
from numba.tests.support import TestCase, run_in_subprocess
|
||
|
|
||
|
|
||
|
class TestNumbaImport(TestCase):
|
||
|
"""
|
||
|
Test behaviour of importing Numba.
|
||
|
"""
|
||
|
|
||
|
def test_laziness(self):
|
||
|
"""
|
||
|
Importing top-level numba features should not import too many modules.
|
||
|
"""
|
||
|
# A heuristic set of modules that shouldn't be imported immediately
|
||
|
banlist = ['cffi',
|
||
|
'distutils',
|
||
|
'numba.cuda',
|
||
|
'numba.cpython.mathimpl',
|
||
|
'numba.cpython.randomimpl',
|
||
|
'numba.tests',
|
||
|
'numba.core.typing.collections',
|
||
|
'numba.core.typing.listdecl',
|
||
|
'numba.core.typing.npdatetime',
|
||
|
]
|
||
|
# Sanity check the modules still exist...
|
||
|
for mod in banlist:
|
||
|
if mod not in ('cffi',):
|
||
|
__import__(mod)
|
||
|
|
||
|
code = """if 1:
|
||
|
from numba import jit, vectorize
|
||
|
from numba.core import types
|
||
|
import sys
|
||
|
print(list(sys.modules))
|
||
|
"""
|
||
|
|
||
|
out, _ = run_in_subprocess(code)
|
||
|
modlist = set(eval(out.strip()))
|
||
|
unexpected = set(banlist) & set(modlist)
|
||
|
self.assertFalse(unexpected, "some modules unexpectedly imported")
|
||
|
|
||
|
def test_no_impl_import(self):
|
||
|
"""
|
||
|
Tests that importing jit does not trigger import of modules containing
|
||
|
lowering implementations that would likely install things in the
|
||
|
builtins registry and have side effects impacting other targets
|
||
|
"""
|
||
|
# None of these modules should be imported through the process of
|
||
|
# doing 'import numba' or 'from numba import njit'
|
||
|
banlist = ['numba.cpython.slicing',
|
||
|
'numba.cpython.tupleobj',
|
||
|
'numba.cpython.enumimpl',
|
||
|
'numba.cpython.hashing',
|
||
|
'numba.cpython.heapq',
|
||
|
'numba.cpython.iterators',
|
||
|
'numba.cpython.numbers',
|
||
|
'numba.cpython.rangeobj',
|
||
|
'numba.cpython.cmathimpl',
|
||
|
'numba.cpython.mathimpl',
|
||
|
'numba.cpython.printimpl',
|
||
|
'numba.cpython.randomimpl',
|
||
|
'numba.core.optional',
|
||
|
'numba.misc.gdb_hook',
|
||
|
'numba.misc.literal',
|
||
|
'numba.misc.cffiimpl',
|
||
|
'numba.np.linalg',
|
||
|
'numba.np.polynomial',
|
||
|
'numba.np.arraymath',
|
||
|
'numba.np.npdatetime',
|
||
|
'numba.np.npyimpl',
|
||
|
'numba.typed.typeddict',
|
||
|
'numba.typed.typedlist',
|
||
|
'numba.experimental.jitclass.base',]
|
||
|
|
||
|
code1 = """if 1:
|
||
|
import sys
|
||
|
import numba
|
||
|
print(list(sys.modules))
|
||
|
"""
|
||
|
|
||
|
code2 = """if 1:
|
||
|
import sys
|
||
|
from numba import njit
|
||
|
@njit
|
||
|
def foo():
|
||
|
pass
|
||
|
print(list(sys.modules))
|
||
|
"""
|
||
|
|
||
|
for code in (code1, code2):
|
||
|
out, _ = run_in_subprocess(code)
|
||
|
modlist = set(eval(out.strip()))
|
||
|
unexpected = set(banlist) & set(modlist)
|
||
|
self.assertFalse(unexpected, "some modules unexpectedly imported")
|
||
|
|
||
|
def test_no_accidental_warnings(self):
|
||
|
# checks that importing Numba isn't accidentally triggering warnings due
|
||
|
# to e.g. deprecated use of import locations from Python's stdlib
|
||
|
code = "import numba"
|
||
|
# See: https://github.com/numba/numba/issues/6831
|
||
|
# bug in setuptools/packaging causing a deprecation warning
|
||
|
flags = ["-Werror", "-Wignore::DeprecationWarning:packaging.version:"]
|
||
|
run_in_subprocess(code, flags)
|
||
|
|
||
|
def test_import_star(self):
|
||
|
# checks that "from numba import *" works.
|
||
|
code = "from numba import *"
|
||
|
run_in_subprocess(code)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
unittest.main()
|