pylint-dev / astroid

A common base representation of python source code for pylint and other projects
https://pylint.readthedocs.io/projects/astroid/en/latest/
GNU Lesser General Public License v2.1
528 stars 273 forks source link

Test failures against NumPy 2.0.0rc2 #2442

Open mgorny opened 5 months ago

mgorny commented 5 months ago

Steps to reproduce

  1. tox -e py312
  2. . .tox/py312/bin/activate
  3. pip install numpy==2.0.0rc2
  4. pytest

Current behavior

FAILED tests/brain/numpy/test_core_einsumfunc.py::test_numpy_function_calls_inferred_as_ndarray - AssertionError: Illicit type for einsum (Uninferable)
FAILED tests/brain/numpy/test_core_fromnumeric.py::BrainNumpyCoreFromNumericTest::test_numpy_function_calls_inferred_as_ndarray - AssertionError: False is not true : Illicit type for sum (Uninferable)
FAILED tests/brain/numpy/test_core_multiarray.py::BrainNumpyCoreMultiarrayTest::test_numpy_function_calls_inferred_as_ndarray - AssertionError: False is not true : Illicit type for inner (builtins.tuple)
FAILED tests/brain/numpy/test_core_numerictypes.py::NumpyBrainCoreNumericTypesTest::test_datetime_astype_return - TypeError: 'in <string>' requires string as left operand, not UninferableBase
FAILED tests/brain/numpy/test_core_numerictypes.py::NumpyBrainCoreNumericTypesTest::test_generic_types_are_subscriptables - AssertionError: Uninferable is not an instance of <class 'astroid.nodes.scoped_nodes.scoped_nodes.ClassDef'>
FAILED tests/brain/numpy/test_core_umath.py::NumpyBrainCoreUmathTest::test_numpy_core_umath_functions_return_type - AssertionError: False is not true : Illicit type for arccos (Uninferable)
FAILED tests/brain/numpy/test_core_umath.py::NumpyBrainCoreUmathTest::test_numpy_core_umath_functions_return_type_tuple - AssertionError: False is not true : Illicit type for frexp (Uninferable)
FAILED tests/test_regrtest.py::NonRegressionTests::test_numpy_distutils - AssertionError: Uninferable is not an instance of <class 'astroid.nodes.node_classes.Const'>
Full log with tracebacks ``` $ pytest ========================================================= test session starts ========================================================= platform linux -- Python 3.12.3, pytest-8.2.0, pluggy-1.5.0 rootdir: /tmp/astroid configfile: pyproject.toml testpaths: tests plugins: cov-5.0.0 collected 1688 items tests/brain/numpy/test_core_einsumfunc.py F. [ 0%] tests/brain/numpy/test_core_fromnumeric.py F [ 0%] tests/brain/numpy/test_core_function_base.py . [ 0%] tests/brain/numpy/test_core_multiarray.py ..F.. [ 0%] tests/brain/numpy/test_core_numeric.py ..... [ 0%] tests/brain/numpy/test_core_numerictypes.py .FF....ss [ 1%] tests/brain/numpy/test_core_umath.py .....FF. [ 1%] tests/brain/numpy/test_ma.py .... [ 2%] tests/brain/numpy/test_ndarray.py ... [ 2%] tests/brain/numpy/test_random_mtrand.py .. [ 2%] tests/brain/test_argparse.py . [ 2%] tests/brain/test_attr.py ..... [ 2%] tests/brain/test_brain.py .s.....s....ss...........................................s........................................... [ 8%] ...............x...................... [ 10%] tests/brain/test_builtin.py .................. [ 12%] tests/brain/test_ctypes.py ....x........................ [ 13%] tests/brain/test_dataclasses.py ..............................................................................x... [ 18%] tests/brain/test_dateutil.py . [ 18%] tests/brain/test_enum.py ............................. [ 20%] tests/brain/test_hashlib.py ... [ 20%] tests/brain/test_multiprocessing.py ... [ 20%] tests/brain/test_named_tuple.py ....................... [ 22%] tests/brain/test_nose.py s [ 22%] tests/brain/test_pathlib.py .... [ 22%] tests/brain/test_pytest.py . [ 22%] tests/brain/test_qt.py sss [ 22%] tests/brain/test_regex.py .X [ 22%] tests/brain/test_signal.py ... [ 22%] tests/brain/test_six.py ....... [ 23%] tests/brain/test_ssl.py . [ 23%] tests/brain/test_threading.py .... [ 23%] tests/brain/test_typing.py . [ 23%] tests/brain/test_typing_extensions.py . [ 23%] tests/brain/test_unittest.py . [ 23%] tests/test_builder.py .......................................................x.. [ 27%] tests/test_constraint.py ................................... [ 29%] tests/test_decorators.py ... [ 29%] tests/test_filter_statements.py . [ 29%] tests/test_group_exceptions.py ... [ 29%] tests/test_helpers.py ............... [ 30%] tests/test_inference.py ..........................................................................................x...........x [ 36%] .....x.........................................................x............................................................... [ 44%] ..........................................................................x........xx.....................x...x................ [ 51%] ..........................s......x........................................ [ 56%] tests/test_inference_calls.py ........................ [ 57%] tests/test_lookup.py ....................................................... [ 60%] tests/test_manager.py ............................................ [ 63%] tests/test_modutils.py ................................................................... [ 67%] tests/test_nodes.py ........................................................................................................... [ 73%] ................................................................................. [ 78%] tests/test_nodes_lineno.py s....................... [ 79%] tests/test_nodes_position.py ... [ 80%] tests/test_object_model.py x...............x.........s......... [ 82%] tests/test_objects.py ...................... [ 83%] tests/test_protocols.py ..................... [ 84%] tests/test_python3.py .......................... [ 86%] tests/test_raw_building.py ............. [ 87%] tests/test_regrtest.py ..............F........... [ 88%] tests/test_scoped_nodes.py .................................................................................................... [ 94%] ................................................................... [ 98%] tests/test_stdlib.py .. [ 98%] tests/test_transforms.py ......... [ 99%] tests/test_type_params.py ..... [ 99%] tests/test_utils.py ........ [100%] ============================================================== FAILURES =============================================================== ____________________________________________ test_numpy_function_calls_inferred_as_ndarray ____________________________________________ @pytest.mark.skipif(not HAS_NUMPY, reason="This test requires the numpy library.") def test_numpy_function_calls_inferred_as_ndarray() -> None: """Test that calls to numpy functions are inferred as numpy.ndarray.""" method = "einsum" inferred_values = list( _inferred_numpy_func_call(method, "ii, np.arange(25).reshape(5, 5)") ) assert len(inferred_values) == 1, f"Too much inferred value for {method:s}" > assert ( inferred_values[-1].pytype() == ".ndarray" ), f"Illicit type for {method:s} ({inferred_values[-1].pytype()})" E AssertionError: Illicit type for einsum (Uninferable) E assert Uninferable == '.ndarray' E + where Uninferable = Uninferable() E + where Uninferable = Uninferable.pytype tests/brain/numpy/test_core_einsumfunc.py:39: AssertionError _____________________________ BrainNumpyCoreFromNumericTest.test_numpy_function_calls_inferred_as_ndarray _____________________________ self = def test_numpy_function_calls_inferred_as_ndarray(self): """Test that calls to numpy functions are inferred as numpy.ndarray.""" licit_array_types = (".ndarray",) for func_ in self.numpy_functions: with self.subTest(typ=func_): inferred_values = list(self._inferred_numpy_func_call(*func_)) self.assertTrue( len(inferred_values) == 1, msg=f"Too much inferred value for {func_[0]:s}", ) > self.assertTrue( inferred_values[-1].pytype() in licit_array_types, msg=f"Illicit type for {func_[0]:s} ({inferred_values[-1].pytype()})", ) E AssertionError: False is not true : Illicit type for sum (Uninferable) tests/brain/numpy/test_core_fromnumeric.py:43: AssertionError _____________________________ BrainNumpyCoreMultiarrayTest.test_numpy_function_calls_inferred_as_ndarray ______________________________ self = def test_numpy_function_calls_inferred_as_ndarray(self): """Test that calls to numpy functions are inferred as numpy.ndarray.""" for infer_wrapper in ( self._inferred_numpy_func_call, self._inferred_numpy_no_alias_func_call, ): for func_ in self.numpy_functions_returning_array: with self.subTest(typ=func_): inferred_values = list(infer_wrapper(*func_)) self.assertTrue( len(inferred_values) == 1, msg="Too much inferred values ({}) for {:s}".format( inferred_values, func_[0] ), ) > self.assertTrue( inferred_values[-1].pytype() == ".ndarray", msg="Illicit type for {:s} ({})".format( func_[0], inferred_values[-1].pytype() ), ) E AssertionError: False is not true : Illicit type for inner (builtins.tuple) tests/brain/numpy/test_core_multiarray.py:97: AssertionError _____________________________________ NumpyBrainCoreNumericTypesTest.test_datetime_astype_return ______________________________________ self = def test_datetime_astype_return(self): """ Test that the return of astype method of the datetime object is inferred as a ndarray. pylint-dev/pylint#3332 """ node = builder.extract_node( """ import numpy as np import datetime test_array = np.datetime64(1, 'us') test_array.astype(datetime.datetime) """ ) licit_array_types = ".ndarray" inferred_values = list(node.infer()) self.assertTrue( len(inferred_values) == 1, msg="Too much inferred value for datetime64.astype", ) self.assertTrue( > inferred_values[-1].pytype() in licit_array_types, msg="Illicit type for {:s} ({})".format( "datetime64.astype", inferred_values[-1].pytype() ), ) E TypeError: 'in ' requires string as left operand, not UninferableBase tests/brain/numpy/test_core_numerictypes.py:329: TypeError ________________________________ NumpyBrainCoreNumericTypesTest.test_generic_types_are_subscriptables _________________________________ self = @unittest.skipUnless( HAS_NUMPY and numpy_supports_type_hints(), f"This test requires the numpy library with a version above {NUMPY_VERSION_TYPE_HINTS_SUPPORT}", ) def test_generic_types_are_subscriptables(self): """Test that all types deriving from generic are subscriptables.""" for type_ in ( "bool_", "bytes_", "character", "complex128", "complex192", "complex64", "complexfloating", "datetime64", "flexible", "float16", "float32", "float64", "float96", "floating", "generic", "inexact", "int16", "int32", "int32", "int64", "int8", "integer", "number", "signedinteger", "str_", "timedelta64", "uint16", "uint32", "uint32", "uint64", "uint8", "unsignedinteger", "void", ): with self.subTest(type_=type_): src = f""" import numpy as np np.{type_}[int] """ node = builder.extract_node(src) cls_node = node.inferred()[0] > self.assertIsInstance(cls_node, nodes.ClassDef) E AssertionError: Uninferable is not an instance of tests/brain/numpy/test_core_numerictypes.py:383: AssertionError _________________________________ NumpyBrainCoreUmathTest.test_numpy_core_umath_functions_return_type _________________________________ self = def test_numpy_core_umath_functions_return_type(self): """Test that functions which should return a ndarray do return it.""" ndarray_returning_func = [ f for f in self.all_ufunc if f not in ("frexp", "modf") ] for func_ in ndarray_returning_func: with self.subTest(typ=func_): inferred_values = list(self._inferred_numpy_func_call(func_)) self.assertTrue( len(inferred_values) == 1, msg="Too much inferred values ({}) for {:s}".format( inferred_values[-1].pytype(), func_ ), ) > self.assertTrue( inferred_values[0].pytype() == ".ndarray", msg=f"Illicit type for {func_:s} ({inferred_values[-1].pytype()})", ) E AssertionError: False is not true : Illicit type for arccos (Uninferable) tests/brain/numpy/test_core_umath.py:209: AssertionError ______________________________ NumpyBrainCoreUmathTest.test_numpy_core_umath_functions_return_type_tuple ______________________________ self = def test_numpy_core_umath_functions_return_type_tuple(self): """Test that functions which should return a pair of ndarray do return it.""" ndarray_returning_func = ("frexp", "modf") for func_ in ndarray_returning_func: with self.subTest(typ=func_): inferred_values = list(self._inferred_numpy_func_call(func_)) self.assertTrue( len(inferred_values) == 1, msg=f"Too much inferred values ({inferred_values}) for {func_:s}", ) > self.assertTrue( inferred_values[-1].pytype() == "builtins.tuple", msg=f"Illicit type for {func_:s} ({inferred_values[-1].pytype()})", ) E AssertionError: False is not true : Illicit type for frexp (Uninferable) tests/brain/numpy/test_core_umath.py:225: AssertionError _______________________________________________ NonRegressionTests.test_numpy_distutils _______________________________________________ self = @unittest.skipUnless(HAS_NUMPY, "Needs numpy") def test_numpy_distutils(self): """Special handling of virtualenv's patching of distutils shouldn't interfere with numpy.distutils. PY312_PLUS -- This test will likely become unnecessary when Python 3.12 is numpy's minimum version. (numpy.distutils will be removed then.) """ node = extract_node( """ from numpy.distutils.misc_util import is_sequence is_sequence("ABC") #@ """ ) inferred = node.inferred() > self.assertIsInstance(inferred[0], nodes.Const) E AssertionError: Uninferable is not an instance of tests/test_regrtest.py:118: AssertionError ======================================================= short test summary info ======================================================= FAILED tests/brain/numpy/test_core_einsumfunc.py::test_numpy_function_calls_inferred_as_ndarray - AssertionError: Illicit type for einsum (Uninferable) FAILED tests/brain/numpy/test_core_fromnumeric.py::BrainNumpyCoreFromNumericTest::test_numpy_function_calls_inferred_as_ndarray - AssertionError: False is not true : Illicit type for sum (Uninferable) FAILED tests/brain/numpy/test_core_multiarray.py::BrainNumpyCoreMultiarrayTest::test_numpy_function_calls_inferred_as_ndarray - AssertionError: False is not true : Illicit type for inner (builtins.tuple) FAILED tests/brain/numpy/test_core_numerictypes.py::NumpyBrainCoreNumericTypesTest::test_datetime_astype_return - TypeError: 'in ' requires string as left operand, not UninferableBase FAILED tests/brain/numpy/test_core_numerictypes.py::NumpyBrainCoreNumericTypesTest::test_generic_types_are_subscriptables - AssertionError: Uninferable is not an instance of FAILED tests/brain/numpy/test_core_umath.py::NumpyBrainCoreUmathTest::test_numpy_core_umath_functions_return_type - AssertionError: False is not true : Illicit type for arccos (Uninferable) FAILED tests/brain/numpy/test_core_umath.py::NumpyBrainCoreUmathTest::test_numpy_core_umath_functions_return_type_tuple - AssertionError: False is not true : Illicit type for frexp (Uninferable) FAILED tests/test_regrtest.py::NonRegressionTests::test_numpy_distutils - AssertionError: Uninferable is not an instance of ================================= 8 failed, 1649 passed, 14 skipped, 16 xfailed, 1 xpassed in 37.53s ================================== ```

Expected behavior

Tests passing :-).

python -c "from astroid import __pkginfo__; print(__pkginfo__.version)" output

3.3.0-dev0

(I've reproduced with e43e045179fe4df7ba2aed96ad5ef180232f39cc)

Pierre-Sassoulas commented 5 months ago

Thank you for opening the issue. We also had issue with the numpy's brain when trying to analyses the pyi in #2375, we have to check if our brain where still up to date with latest numpy and if analysing pyi was a better bet. With some knowledge gathered with pylint 3.2.0 's release it seems the pyi are not ready (we have to merge pyi with the implementation because using the pyi and having an empty function body doesn't work). We never had to make brain for 2 versions of a lib before so either way, there's probably prior work to do to make this work.

jorenham commented 2 months ago

Numpy 2.1 came with a bunch of typing-related fixes. So it might be worth checking whether these tests still fail against it.