changeset 879:27d210790d27

Looks like the 'decorators' field in the AST was renamed to 'decorator_list' in Python 2.6, so look for both. See #379.
author cmlenz
date Thu, 15 Apr 2010 21:38:21 +0000
parents abfabaea906f
children 3b16d762445b
files genshi/template/astutil.py genshi/template/tests/eval.py
diffstat 2 files changed, 22 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/genshi/template/astutil.py
+++ b/genshi/template/astutil.py
@@ -130,9 +130,14 @@
             self._write('**' + node.kwarg)
 
     # FunctionDef(identifier name, arguments args,
-    #                           stmt* body, expr* decorators)
+    #                           stmt* body, expr* decorator_list)
     def visit_FunctionDef(self, node):
-        for decorator in getattr(node, 'decorators', ()):
+        decarators = ()
+        if hasattr(node, 'decorator_list'):
+            decorators = getattr(node, 'decorator_list')
+        else: # different name in earlier Python versions
+            decorators = getattr(node, 'decorators', ())
+        for decorator in decorators:
             self._new_line()
             self._write('@')
             self.visit(decorator)
--- a/genshi/template/tests/eval.py
+++ b/genshi/template/tests/eval.py
@@ -588,6 +588,21 @@
         suite.execute(data)
         self.assertEqual(['foo', 'bar'], data['x'])
 
+    def test_def_with_decorator(self):
+        suite = Suite("""
+def lower(fun):
+    return lambda: fun().lower()
+
+@lower
+def say_hi():
+    return 'Hi!'
+
+result = say_hi()
+""")
+        data = {}
+        suite.execute(data)
+        self.assertEqual('hi!', data['result'])
+
     def test_delete(self):
         suite = Suite("""foo = 42
 del foo
Copyright (C) 2012-2017 Edgewall Software