diff --git a/doc/build/unreleased/418.rst b/doc/build/unreleased/418.rst new file mode 100644 index 0000000..671481b --- /dev/null +++ b/doc/build/unreleased/418.rst @@ -0,0 +1,7 @@ +.. change:: + :tags: bug, parser + :tickets: 418 + + Fix undefined variable errors when strict_undefined is True and using + nested list comprehension. + diff --git a/mako/pyparser.py b/mako/pyparser.py index bb9e72d..1da9ddb 100644 --- a/mako/pyparser.py +++ b/mako/pyparser.py @@ -93,6 +93,7 @@ def visit_FunctionDef(self, node): def visit_ListComp(self, node): if self.in_function: for comp in node.generators: + self.visit(comp.target) self.visit(comp.iter) else: self.generic_visit(node) @@ -102,6 +103,7 @@ def visit_ListComp(self, node): def visit_DictComp(self, node): if self.in_function: for comp in node.generators: + self.visit(comp.target) self.visit(comp.iter) else: self.generic_visit(node) diff --git a/test/test_template.py b/test/test_template.py index 96aecb2..8d6eb8f 100644 --- a/test/test_template.py +++ b/test/test_template.py @@ -916,6 +916,19 @@ def foo(): eq_(result_lines(t.render()), ["foo"]) + def test_nested_list_comprehensions_in_function_plus_undeclared_strict( + self, + ): + t = Template( + """ +<%foo = lambda b : sum(f for s in b for f in s)%>\ +${ foo(([1,2],[3,4]))} +""", + strict_undefined=True, + ) + + eq_(result_lines(t.render()), ["10"]) + class StopRenderingTest(TemplateTest): def test_return_in_template(self):