summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurelien Campeas <aurelien.campeas@logilab.fr>2010-11-26 18:03:21 +0100
committerAurelien Campeas <aurelien.campeas@logilab.fr>2010-11-26 18:03:21 +0100
commitd76f9681147d4b4f676ed044bd5165aec180642b (patch)
tree8a2ab92fc640445d90ba9fcf5de206223a4ac622
parent312f32abac70c8fd3e1fe13b75dcb61121dd8808 (diff)
downloadlogilab-common-d76f9681147d4b4f676ed044bd5165aec180642b.tar.gz
[decorators] cached try to keep the original function name
-rw-r--r--decorators.py25
-rw-r--r--test/unittest_decorators.py5
2 files changed, 20 insertions, 10 deletions
diff --git a/decorators.py b/decorators.py
index de488d9..2218087 100644
--- a/decorators.py
+++ b/decorators.py
@@ -15,12 +15,7 @@
#
# You should have received a copy of the GNU Lesser General Public License along
# with logilab-common. If not, see <http://www.gnu.org/licenses/>.
-"""A few useful function/method decorators.
-
-
-
-
-"""
+""" A few useful function/method decorators. """
__docformat__ = "restructuredtext en"
from types import MethodType
@@ -43,7 +38,11 @@ def cached(callableobj, keyarg=None):
value = callableobj(self, *args)
setattr(self, cache, value)
return value
- cache_wrapper1.__doc__ = callableobj.__doc__
+ try:
+ cache_wrapper1.__doc__ = callableobj.__doc__
+ cache_wrapper1.func_name = callableobj.func_name
+ except:
+ pass
return cache_wrapper1
elif keyarg:
@@ -64,7 +63,11 @@ def cached(callableobj, keyarg=None):
#print 'miss', self, cache, key
_cache[key] = callableobj(self, *args, **kwargs)
return _cache[key]
- cache_wrapper2.__doc__ = callableobj.__doc__
+ try:
+ cache_wrapper2.__doc__ = callableobj.__doc__
+ cache_wrapper2.func_name = callableobj.func_name
+ except:
+ pass
return cache_wrapper2
def cache_wrapper3(self, *args):
@@ -82,7 +85,11 @@ def cached(callableobj, keyarg=None):
#print 'miss'
_cache[args] = callableobj(self, *args)
return _cache[args]
- cache_wrapper3.__doc__ = callableobj.__doc__
+ try:
+ cache_wrapper3.__doc__ = callableobj.__doc__
+ cache_wrapper3.func_name = callableobj.func_name
+ except:
+ pass
return cache_wrapper3
def clear_cache(obj, funcname):
diff --git a/test/unittest_decorators.py b/test/unittest_decorators.py
index ce7213e..0217067 100644
--- a/test/unittest_decorators.py
+++ b/test/unittest_decorators.py
@@ -43,7 +43,7 @@ class DecoratorsTC(TestCase):
inst = MyClass()
self.assertEqual(inst.foo(4), 16)
- def test_cached_preserves_docstrings(self):
+ def test_cached_preserves_docstrings_and_name(self):
class Foo(object):
@cached
def foo(self):
@@ -55,8 +55,11 @@ class DecoratorsTC(TestCase):
def quux(self, zogzog):
""" what's up doc ? """
self.assertEqual(Foo.foo.__doc__, """ what's up doc ? """)
+ self.assertEqual(Foo.foo.func_name, 'foo')
self.assertEqual(Foo.bar.__doc__, """ what's up doc ? """)
+ self.assertEqual(Foo.bar.func_name, 'bar')
self.assertEqual(Foo.quux.__doc__, """ what's up doc ? """)
+ self.assertEqual(Foo.quux.func_name, 'quux')
if __name__ == '__main__':
unittest_main()