Mercurial > genshi > genshi-test
changeset 7:e0f230569eb1
Fixes to expression evaluation by jborg:
* and/or was interpreted as bitwise operations in eval.py.
* The "in" operator was broken and "not in" was missing.
author | cmlenz |
---|---|
date | Sun, 04 Jun 2006 10:49:24 +0000 |
parents | 5da45906dda7 |
children | ea47069a901c |
files | markup/eval.py |
diffstat | 1 files changed, 15 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/markup/eval.py +++ b/markup/eval.py @@ -80,6 +80,15 @@ False >>> Expression('1 != 3 == 3').evaluate(data) True + >>> Expression('1 > 0').evaluate(data) + True + >>> Expression('True and "Foo"').evaluate(data) + 'Foo' + >>> data = dict(items=[1, 2, 3]) + >>> Expression('2 in items').evaluate(data) + True + >>> Expression('not 2 in items').evaluate(data) + False Built-in functions such as `len()` are also available in template expressions: @@ -163,15 +172,18 @@ # Operators def _visit_and(self, node, data): - return reduce(operator.and_, [self._visit(n, data) for n in node.nodes]) + return reduce(lambda x, y: x and y, + [self._visit(n, data) for n in node.nodes]) def _visit_or(self, node, data): - return reduce(operator.or_, [self._visit(n, data) for n in node.nodes]) + return reduce(lambda x, y: x or y, + [self._visit(n, data) for n in node.nodes]) _OP_MAP = {'==': operator.eq, '!=': operator.ne, '<': operator.lt, '<=': operator.le, '>': operator.gt, '>=': operator.ge, - 'in': operator.contains} + 'in': lambda x, y: operator.contains(y, x), + 'not in': lambda x, y: not operator.contains(y, x)} def _visit_compare(self, node, data): result = self._visit(node.expr, data) ops = node.ops[:]