diff options
author | Aurelien Campeas <aurelien.campeas@logilab.fr> | 2010-11-26 18:03:21 +0100 |
---|---|---|
committer | Aurelien Campeas <aurelien.campeas@logilab.fr> | 2010-11-26 18:03:21 +0100 |
commit | d76f9681147d4b4f676ed044bd5165aec180642b (patch) | |
tree | 8a2ab92fc640445d90ba9fcf5de206223a4ac622 | |
parent | 312f32abac70c8fd3e1fe13b75dcb61121dd8808 (diff) | |
download | logilab-common-d76f9681147d4b4f676ed044bd5165aec180642b.tar.gz |
[decorators] cached try to keep the original function name
-rw-r--r-- | decorators.py | 25 | ||||
-rw-r--r-- | test/unittest_decorators.py | 5 |
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() |