annotate markup/eval.py @ 16:bcba0181049c trunk

Minor fix for expression evaluation.
author cmlenz
date Fri, 16 Jun 2006 15:29:29 +0000
parents c7d33e0c9839
children b4f78c05e5c9
rev   line source
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
2 #
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2006 Christopher Lenz
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
4 # All rights reserved.
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
5 #
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
6 # This software is licensed as described in the file COPYING, which
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
7 # you should have received as part of this distribution. The terms
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
8 # are also available at http://trac.edgewall.com/license.html.
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
9 #
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
10 # This software consists of voluntary contributions made by many
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
11 # individuals. For the exact contribution history, see the revision
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
12 # history and logs, available at http://projects.edgewall.com/trac/.
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
13
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
14 import __builtin__
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
15 import compiler
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
16 import operator
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
17
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
18 from markup.core import Stream
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
19
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
20 __all__ = ['Expression']
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
21
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
22
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
23 class Expression(object):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
24 """Evaluates Python expressions used in templates.
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
25
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
26 >>> data = dict(test='Foo', items=[1, 2, 3], dict={'some': 'thing'})
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
27 >>> Expression('test').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
28 'Foo'
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
29 >>> Expression('items[0]').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
30 1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
31 >>> Expression('items[-1]').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
32 3
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
33 >>> Expression('dict["some"]').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
34 'thing'
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
35
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
36 Similar to e.g. Javascript, expressions in templates can use the dot
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
37 notation for attribute access to access items in mappings:
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
38
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
39 >>> Expression('dict.some').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
40 'thing'
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
41
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
42 This also works the other way around: item access can be used to access
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
43 any object attribute (meaning there's no use for `getattr()` in templates):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
44
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
45 >>> class MyClass(object):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
46 ... myattr = 'Bar'
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
47 >>> data = dict(mine=MyClass(), key='myattr')
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
48 >>> Expression('mine.myattr').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
49 'Bar'
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
50 >>> Expression('mine["myattr"]').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
51 'Bar'
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
52 >>> Expression('mine[key]').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
53 'Bar'
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
54
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
55 Most of the standard Python operators are also available to template
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
56 expressions. Bitwise operators (including inversion and shifting) are not
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
57 supported.
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
58
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
59 >>> Expression('1 + 1').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
60 2
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
61 >>> Expression('3 - 1').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
62 2
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
63 >>> Expression('1 * 2').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
64 2
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
65 >>> Expression('4 / 2').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
66 2
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
67 >>> Expression('4 // 3').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
68 1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
69 >>> Expression('4 % 3').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
70 1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
71 >>> Expression('2 ** 3').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
72 8
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
73 >>> Expression('not True').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
74 False
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
75 >>> Expression('True and False').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
76 False
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
77 >>> Expression('True or False').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
78 True
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
79 >>> Expression('1 == 3').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
80 False
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
81 >>> Expression('1 != 3 == 3').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
82 True
7
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
83 >>> Expression('1 > 0').evaluate(data)
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
84 True
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
85 >>> Expression('True and "Foo"').evaluate(data)
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
86 'Foo'
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
87 >>> data = dict(items=[1, 2, 3])
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
88 >>> Expression('2 in items').evaluate(data)
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
89 True
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
90 >>> Expression('not 2 in items').evaluate(data)
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
91 False
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
92
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
93 Built-in functions such as `len()` are also available in template
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
94 expressions:
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
95
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
96 >>> data = dict(items=[1, 2, 3])
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
97 >>> Expression('len(items)').evaluate(data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
98 3
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
99 """
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
100 __slots__ = ['source', 'ast']
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
101 __visitors = {}
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
102
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
103 def __init__(self, source):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
104 self.source = source
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
105 self.ast = None
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
106
14
c7d33e0c9839 The `<py:match>` directive now protects itself against simple infinite recursion (see MatchDirective), while still allowing recursion in general.
cmlenz
parents: 7
diff changeset
107 def evaluate(self, data):
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
108 if not self.ast:
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
109 self.ast = compiler.parse(self.source, 'eval')
14
c7d33e0c9839 The `<py:match>` directive now protects itself against simple infinite recursion (see MatchDirective), while still allowing recursion in general.
cmlenz
parents: 7
diff changeset
110 return self._visit(self.ast.node, data)
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
111
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
112 def __repr__(self):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
113 return '<Expression "%s">' % self.source
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
114
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
115 # AST traversal
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
116
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
117 def _visit(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
118 v = self.__visitors.get(node.__class__)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
119 if not v:
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
120 v = getattr(self, '_visit_%s' % node.__class__.__name__.lower())
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
121 self.__visitors[node.__class__] = v
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
122 return v(node, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
123
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
124 def _visit_expression(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
125 for child in node.getChildNodes():
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
126 return self._visit(child, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
127
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
128 # Functions & Accessors
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
129
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
130 def _visit_callfunc(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
131 func = self._visit(node.node, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
132 if func is None:
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
133 return None
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
134 args = [self._visit(arg, data) for arg in node.args
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
135 if not isinstance(arg, compiler.ast.Keyword)]
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
136 kwargs = dict([(arg.name, self._visit(arg.expr, data)) for arg
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
137 in node.args if isinstance(arg, compiler.ast.Keyword)])
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
138 return func(*args, **kwargs)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
139
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
140 def _visit_getattr(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
141 obj = self._visit(node.expr, data)
14
c7d33e0c9839 The `<py:match>` directive now protects itself against simple infinite recursion (see MatchDirective), while still allowing recursion in general.
cmlenz
parents: 7
diff changeset
142 if hasattr(obj, node.attrname):
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
143 return getattr(obj, node.attrname)
16
bcba0181049c Minor fix for expression evaluation.
cmlenz
parents: 14
diff changeset
144 try:
14
c7d33e0c9839 The `<py:match>` directive now protects itself against simple infinite recursion (see MatchDirective), while still allowing recursion in general.
cmlenz
parents: 7
diff changeset
145 return obj[node.attrname]
16
bcba0181049c Minor fix for expression evaluation.
cmlenz
parents: 14
diff changeset
146 except TypeError:
14
c7d33e0c9839 The `<py:match>` directive now protects itself against simple infinite recursion (see MatchDirective), while still allowing recursion in general.
cmlenz
parents: 7
diff changeset
147 return None
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
148
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
149 def _visit_slice(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
150 obj = self._visit(node.expr, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
151 lower = node.lower and self._visit(node.lower, data) or None
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
152 upper = node.upper and self._visit(node.upper, data) or None
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
153 return obj[lower:upper]
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
154
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
155 def _visit_subscript(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
156 obj = self._visit(node.expr, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
157 subs = map(lambda sub: self._visit(sub, data), node.subs)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
158 if len(subs) == 1:
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
159 subs = subs[0]
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
160 try:
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
161 return obj[subs]
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
162 except (KeyError, IndexError, TypeError):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
163 try:
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
164 return getattr(obj, subs)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
165 except (AttributeError, TypeError):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
166 return None
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
167
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
168 # Operators
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
169
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
170 def _visit_and(self, node, data):
7
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
171 return reduce(lambda x, y: x and y,
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
172 [self._visit(n, data) for n in node.nodes])
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
173
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
174 def _visit_or(self, node, data):
7
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
175 return reduce(lambda x, y: x or y,
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
176 [self._visit(n, data) for n in node.nodes])
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
177
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
178 _OP_MAP = {'==': operator.eq, '!=': operator.ne,
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
179 '<': operator.lt, '<=': operator.le,
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
180 '>': operator.gt, '>=': operator.ge,
7
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
181 'in': lambda x, y: operator.contains(y, x),
798ebd2425dc Fixes to expression evaluation by jborg:
cmlenz
parents: 1
diff changeset
182 'not in': lambda x, y: not operator.contains(y, x)}
1
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
183 def _visit_compare(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
184 result = self._visit(node.expr, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
185 ops = node.ops[:]
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
186 ops.reverse()
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
187 for op, rval in ops:
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
188 result = self._OP_MAP[op](result, self._visit(rval, data))
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
189 return result
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
190
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
191 def _visit_add(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
192 return self._visit(node.left, data) + self._visit(node.right, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
193
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
194 def _visit_div(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
195 return self._visit(node.left, data) / self._visit(node.right, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
196
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
197 def _visit_floordiv(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
198 return self._visit(node.left, data) // self._visit(node.right, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
199
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
200 def _visit_mod(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
201 return self._visit(node.left, data) % self._visit(node.right, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
202
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
203 def _visit_mul(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
204 return self._visit(node.left, data) * self._visit(node.right, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
205
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
206 def _visit_power(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
207 return self._visit(node.left, data) ** self._visit(node.right, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
208
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
209 def _visit_sub(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
210 return self._visit(node.left, data) - self._visit(node.right, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
211
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
212 def _visit_not(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
213 return not self._visit(node.expr, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
214
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
215 def _visit_unaryadd(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
216 return +self._visit(node.expr, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
217
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
218 def _visit_unarysub(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
219 return -self._visit(node.expr, data)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
220
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
221 # Identifiers & Literals
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
222
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
223 def _visit_name(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
224 val = data.get(node.name)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
225 if val is None:
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
226 val = getattr(__builtin__, node.name, None)
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
227 return val
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
228
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
229 def _visit_const(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
230 return node.value
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
231
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
232 def _visit_dict(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
233 return dict([(self._visit(k, data), self._visit(v, data))
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
234 for k, v in node.items])
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
235
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
236 def _visit_tuple(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
237 return tuple([self._visit(n, data) for n in node.nodes])
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
238
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
239 def _visit_list(self, node, data):
5479aae32f5a Initial import.
cmlenz
parents:
diff changeset
240 return [self._visit(n, data) for n in node.nodes]
Copyright (C) 2012-2017 Edgewall Software