# HG changeset patch # User cmlenz # Date 1157707062 0 # Node ID 96a7e5011c69caa062b40c8e1f6abe0e7ce41e2f # Parent 4d8a9e03b23deeb8a16d2e8a69d0b9f8d45893d9 Use list comprehension instead of `map()` in the AST transformer. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -33,6 +33,7 @@ * Fixes for `py:match` which would get confused when it should be applied to multiple elements (ticket #49). * Using namespace prefixes in XPath expressions is now supported. + * Expressions now correctly handle slices (ticket #51). Version 0.2 diff --git a/markup/eval.py b/markup/eval.py --- a/markup/eval.py +++ b/markup/eval.py @@ -241,7 +241,7 @@ def visitCallFunc(self, node, *args, **kwargs): node.node = self.visit(node.node, *args, **kwargs) - node.args = map(lambda x: self.visit(x, *args, **kwargs), node.args) + node.args = [self.visit(x, *args, **kwargs) for x in node.args] if node.star_args: node.star_args = self.visit(node.star_args, *args, **kwargs) if node.dstar_args: @@ -259,13 +259,13 @@ def visitSubscript(self, node, *args, **kwargs): node.expr = self.visit(node.expr, *args, **kwargs) - node.subs = map(lambda x: self.visit(x, *args, **kwargs), node.subs) + node.subs = [self.visit(x, *args, **kwargs) for x in node.subs] return node # Operators def _visitBoolOp(self, node, *args, **kwargs): - node.nodes = map(lambda x: self.visit(x, *args, **kwargs), node.nodes) + node.nodes = [self.visit(x, *args, **kwargs) for x in node.nodes] return node visitAnd = visitOr = visitBitand = visitBitor = _visitBoolOp @@ -279,8 +279,7 @@ def visitCompare(self, node, *args, **kwargs): node.expr = self.visit(node.expr, *args, **kwargs) - node.ops = map(lambda (op, n): (op, self.visit(n, *args, **kwargs)), - node.ops) + node.ops = [(op, self.visit(n, *args, **kwargs)) for op, n in node.ops] return node def _visitUnaryOp(self, node, *args, **kwargs): @@ -301,28 +300,27 @@ return node def visitDict(self, node, *args, **kwargs): - node.items = map(lambda (k, v): (self.visit(k, *args, **kwargs), - self.visit(v, *args, **kwargs)), - node.items) + node.items = [(self.visit(k, *args, **kwargs), + self.visit(v, *args, **kwargs)) for k, v in node.items] return node def visitTuple(self, node, *args, **kwargs): - node.nodes = map(lambda n: self.visit(n, *args, **kwargs), node.nodes) + node.nodes = [self.visit(n, *args, **kwargs) for n in node.nodes] return node def visitList(self, node, *args, **kwargs): - node.nodes = map(lambda n: self.visit(n, *args, **kwargs), node.nodes) + node.nodes = [self.visit(n, *args, **kwargs) for n in node.nodes] return node def visitListComp(self, node, *args, **kwargs): node.expr = self.visit(node.expr, *args, **kwargs) - node.quals = map(lambda x: self.visit(x, *args, **kwargs), node.quals) + node.quals = [self.visit(x, *args, **kwargs) for x in node.quals] return node def visitListCompFor(self, node, *args, **kwargs): node.assign = self.visit(node.assign, *args, **kwargs) node.list = self.visit(node.list, *args, **kwargs) - node.ifs = map(lambda x: self.visit(x, *args, **kwargs), node.ifs) + node.ifs = [self.visit(x, *args, **kwargs) for x in node.ifs] return node def visitListCompIf(self, node, *args, **kwargs): @@ -337,7 +335,7 @@ def visitGenExprFor(self, node, *args, **kwargs): node.assign = self.visit(node.assign, *args, **kwargs) node.iter = self.visit(node.iter, *args, **kwargs) - node.ifs = map(lambda x: self.visit(x, *args, **kwargs), node.ifs) + node.ifs = [self.visit(x, *args, **kwargs) for x in node.ifs] return node def visitGenExprIf(self, node, *args, **kwargs): @@ -346,7 +344,7 @@ def visitGenExprInner(self, node, *args, **kwargs): node.expr = self.visit(node.expr, locals_=True, *args, **kwargs) - node.quals = map(lambda x: self.visit(x, *args, **kwargs), node.quals) + node.quals = [self.visit(x, *args, **kwargs) for x in node.quals] return node def visitSlice(self, node, *args, **kwargs): @@ -358,7 +356,7 @@ return node def visitSliceobj(self, node, *args, **kwargs): - node.nodes = map(lambda x: self.visit(x, *args, **kwargs), node.nodes) + node.nodes = [self.visit(x, *args, **kwargs) for x in node.nodes] return node @@ -385,7 +383,7 @@ def visitListComp(self, node, locals_=False): node.expr = self.visit(node.expr, locals_=True) - node.quals = map(lambda x: self.visit(x, locals_=True), node.quals) + node.quals = [self.visit(qual, locals_=True) for qual in node.quals] return node def visitName(self, node, locals_=False): @@ -397,5 +395,5 @@ def visitSubscript(self, node, locals_=False): return ast.CallFunc(ast.Name('_lookup_item'), [ ast.Name('data'), self.visit(node.expr, locals_=locals_), - ast.Tuple(map(lambda x: self.visit(x, locals_=locals_), node.subs)) + ast.Tuple([self.visit(sub, locals_=locals_) for sub in node.subs]) ]) diff --git a/markup/tests/eval.py b/markup/tests/eval.py --- a/markup/tests/eval.py +++ b/markup/tests/eval.py @@ -250,8 +250,9 @@ expr = Expression("[i['name'] for i in items if i['value'] > 1]") self.assertEqual(['b'], expr.evaluate({'items': items})) - # generator expressions only supported in Python 2.4 and up if sys.version_info >= (2, 4): + # Generator expressions only supported in Python 2.4 and up + def test_generator_expression(self): expr = Expression("list(n for n in numbers if n < 2)") self.assertEqual([0, 1], expr.evaluate({'numbers': range(5)}))