From 1cf413ff986cf464202a07df60e7bd54695ed0e0 Mon Sep 17 00:00:00 2001 From: Claudiu Popa Date: Tue, 9 Jun 2020 22:02:48 +0200 Subject: [PATCH] `FunctionDef.is_generator` properly handles `yield` nodes in `If` tests (#799) Close PyCQA/pylint#3583 --- ChangeLog | 4 ++++ astroid/node_classes.py | 5 +++++ tests/unittest_nodes.py | 13 +++++++++++++ 3 files changed, 22 insertions(+) diff --git a/ChangeLog b/ChangeLog index b407e6ed3c..5e6a8a03fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -19,6 +19,10 @@ Release Date: TBA Close PyCQA/pylint#3639 +* `FunctionDef.is_generator` properly handles `yield` nodes in `If` tests + + Close PyCQA/pylint#3583 + What's New in astroid 2.4.2? ============================ diff --git a/astroid/node_classes.py b/astroid/node_classes.py index 621dc5f214..8cc8585d97 100644 --- a/astroid/node_classes.py +++ b/astroid/node_classes.py @@ -3508,6 +3508,11 @@ def get_children(self): def has_elif_block(self): return len(self.orelse) == 1 and isinstance(self.orelse[0], If) + def _get_yield_nodes_skip_lambdas(self): + """An If node can contain a Yield node in the test""" + yield from self.test._get_yield_nodes_skip_lambdas() + yield from super()._get_yield_nodes_skip_lambdas() + class IfExp(NodeNG): """Class representing an :class:`ast.IfExp` node. diff --git a/tests/unittest_nodes.py b/tests/unittest_nodes.py index 07733e5fcb..5b6a39e3a4 100644 --- a/tests/unittest_nodes.py +++ b/tests/unittest_nodes.py @@ -1347,5 +1347,18 @@ def paused_iter(iterable): assert bool(node.is_generator()) +def test_is_generator_for_yield_in_if(): + code = """ + import asyncio + + def paused_iter(iterable): + if (yield from asyncio.sleep(0.01)): + pass + return + """ + node = astroid.extract_node(code) + assert bool(node.is_generator()) + + if __name__ == "__main__": unittest.main()