diff options
author | Mike Blume <mike@loggly.com> | 2013-10-07 16:09:32 -0700 |
---|---|---|
committer | Mike Blume <mike@loggly.com> | 2013-10-07 16:16:59 -0700 |
commit | c23721be0e34b4b7bc1e2b4735eea86c7fd05c19 (patch) | |
tree | 8eff8b36f895a11255bc1dc90610982c9ea0d61f | |
parent | b287cb9033168e42b13feecbc3ffe3900afc1eb5 (diff) | |
download | repoze-lru-c23721be0e34b4b7bc1e2b4735eea86c7fd05c19.tar.gz |
fix crash on memoizing partial
functools.partial objects don't have __module__ or __name__
this is arguably a problem with functools, but accomodate it
anyway.
-rw-r--r-- | repoze/lru/__init__.py | 11 | ||||
-rw-r--r-- | repoze/lru/tests.py | 10 |
2 files changed, 18 insertions, 3 deletions
diff --git a/repoze/lru/__init__.py b/repoze/lru/__init__.py index 8e48859..c757851 100644 --- a/repoze/lru/__init__.py +++ b/repoze/lru/__init__.py @@ -287,9 +287,14 @@ class lru_cache(object): val = f(*arg) cache.put(arg, val) return val - lru_cached.__module__ = f.__module__ - lru_cached.__name__ = f.__name__ - lru_cached.__doc__ = f.__doc__ + try: + lru_cached.__module__ = f.__module__ + lru_cached.__name__ = f.__name__ + lru_cached.__doc__ = f.__doc__ + except AttributeError: + # functools.partial objects don't have __module__ or __name__. + # Ignore. + pass return lru_cached diff --git a/repoze/lru/tests.py b/repoze/lru/tests.py index 8866a22..fb8e79b 100644 --- a/repoze/lru/tests.py +++ b/repoze/lru/tests.py @@ -562,6 +562,16 @@ class DecoratorTests(unittest.TestCase): self.assertEqual(result3, 2 * "hello") self.assertTrue(stop - start > 0.1) + def test_partial(self): + """lru_cache decorator must not crash on functools.partial instances""" + def add(a,b): + return a + b + from functools import partial + from repoze.lru import lru_cache + add_five = partial(add, 5) + decorated = lru_cache(20)(add_five) + self.assertEqual(decorated(3), 8) + class DummyLRUCache(dict): |