From 9794eb4d5336641797cea0978b920aa76f26dd3d Mon Sep 17 00:00:00 2001 From: Mark Byrne Date: Thu, 3 Nov 2022 20:12:15 +0100 Subject: [PATCH 1/2] Infer the `length` argument of the ``random.sample`` function. Refs PyCQA/pylint#7706 --- ChangeLog | 4 ++++ astroid/brain/brain_random.py | 10 +++++----- tests/unittest_brain.py | 23 +++++++++++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 00eec586d..fab697b0d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16,6 +16,10 @@ Release date: TBA Refs PyCQA/pylint#2567 +* Infer the `length` argument of the ``random.sample`` function. + + Refs PyCQA/pylint#7706 + * Add ``_value2member_map_`` member to the ``enum`` brain. Refs PyCQA/pylint#3941 diff --git a/astroid/brain/brain_random.py b/astroid/brain/brain_random.py index e66aa81a0..a580ff704 100644 --- a/astroid/brain/brain_random.py +++ b/astroid/brain/brain_random.py @@ -42,10 +42,10 @@ def infer_random_sample(node, context=None): if len(node.args) != 2: raise UseInferenceDefault - length = node.args[1] - if not isinstance(length, Const): + inferred_length = helpers.safe_infer(node.args[1], context=context) + if not isinstance(inferred_length, Const): raise UseInferenceDefault - if not isinstance(length.value, int): + if not isinstance(inferred_length.value, int): raise UseInferenceDefault inferred_sequence = helpers.safe_infer(node.args[0], context=context) @@ -55,12 +55,12 @@ def infer_random_sample(node, context=None): if not isinstance(inferred_sequence, ACCEPTED_ITERABLES_FOR_SAMPLE): raise UseInferenceDefault - if length.value > len(inferred_sequence.elts): + if inferred_length.value > len(inferred_sequence.elts): # In this case, this will raise a ValueError raise UseInferenceDefault try: - elts = random.sample(inferred_sequence.elts, length.value) + elts = random.sample(inferred_sequence.elts, inferred_length.value) except ValueError as exc: raise UseInferenceDefault from exc diff --git a/tests/unittest_brain.py b/tests/unittest_brain.py index 114751c8d..7a39a19c6 100644 --- a/tests/unittest_brain.py +++ b/tests/unittest_brain.py @@ -2395,6 +2395,29 @@ def test_inferred_successfully(self) -> None: elems = sorted(elem.value for elem in inferred.elts) self.assertEqual(elems, [1, 2]) + def test_arguments_inferred_successfully(self) -> None: + """Test inference of `random.sample` when both arguments are of type `nodes.Call`.""" + node = astroid.extract_node( + """ + import random + + def sequence(): + return [1, 2] + + random.sample(sequence(), len([1,2])) #@ + """ + ) + # Check that arguments are of type `nodes.Call`. + sequence, length = node.args + self.assertIsInstance(sequence, astroid.Call) + self.assertIsInstance(length, astroid.Call) + + # Check the inference of `random.sample` call. + inferred = next(node.infer()) + self.assertIsInstance(inferred, astroid.List) + elems = sorted(elem.value for elem in inferred.elts) + self.assertEqual(elems, [1, 2]) + def test_no_crash_on_evaluatedobject(self) -> None: node = astroid.extract_node( """ From 92d04918aff1227ab7c411ca0d8aa57fc5afb0e2 Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Fri, 4 Nov 2022 11:01:31 +0100 Subject: [PATCH 2/2] Move changelog entry to 2.12.13 --- ChangeLog | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 59229ceff..a34a49b13 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16,10 +16,6 @@ Release date: TBA Refs PyCQA/pylint#2567 -* Infer the `length` argument of the ``random.sample`` function. - - Refs PyCQA/pylint#7706 - * Prevent returning an empty list for ``ClassDef.slots()`` when the mro list contains one class & it is not ``object``. Refs PyCQA/pylint#5099 @@ -33,6 +29,9 @@ What's New in astroid 2.12.13? ============================== Release date: TBA +* Infer the `length` argument of the ``random.sample`` function. + + Refs PyCQA/pylint#7706 What's New in astroid 2.12.12?