changeset 702:e5b0d9d6b406 trunk

Improve error reporting when accessing an attribute in a Python expression raises an `AttributeError`. Closes #191. Thanks to Michele Cella for the patch!
author cmlenz
date Mon, 31 Mar 2008 09:30:26 +0000
parents 08f22328303d
children dc969bd1ad4c
files ChangeLog genshi/template/eval.py genshi/template/tests/eval.py
diffstat 3 files changed, 20 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -69,6 +69,8 @@
    content in memory, which could cause excessive memory use on long pages.
    The buffering can be disabled using the new `buffer` optimization hint on
    the `<py:match>` directive.
+ * Improve error reporting when accessing an attribute in a Python expression
+   raises an `AttributeError` (ticket #191).
 
 
 Version 0.4.4
--- a/genshi/template/eval.py
+++ b/genshi/template/eval.py
@@ -271,12 +271,16 @@
 
     def lookup_attr(cls, obj, key):
         __traceback_hide__ = True
-        val = getattr(obj, key, UNDEFINED)
-        if val is UNDEFINED:
-            try:
-                val = obj[key]
-            except (KeyError, TypeError):
-                val = cls.undefined(key, owner=obj)
+        try:
+            val = getattr(obj, key)
+        except AttributeError:
+            if hasattr(obj.__class__, key):
+                raise
+            else:
+                try:
+                    val = obj[key]
+                except (KeyError, TypeError):
+                    val = cls.undefined(key, owner=obj)
         return val
     lookup_attr = classmethod(lookup_attr)
 
--- a/genshi/template/tests/eval.py
+++ b/genshi/template/tests/eval.py
@@ -342,11 +342,16 @@
 
     def test_getattr_exception(self):
         class Something(object):
-            def prop(self):
+            def prop_a(self):
                 raise NotImplementedError
-            prop = property(prop)
+            prop_a = property(prop_a)
+            def prop_b(self):
+                raise AttributeError
+            prop_b = property(prop_b)
         self.assertRaises(NotImplementedError,
-                          Expression('s.prop').evaluate, {'s': Something()})
+                          Expression('s.prop_a').evaluate, {'s': Something()})
+        self.assertRaises(AttributeError,
+                          Expression('s.prop_b').evaluate, {'s': Something()})
 
     def test_getitem_undefined_string(self):
         class Something(object):
Copyright (C) 2012-2017 Edgewall Software