summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blume <mike@loggly.com>2013-10-07 16:09:32 -0700
committerMike Blume <mike@loggly.com>2013-10-07 16:16:59 -0700
commitc23721be0e34b4b7bc1e2b4735eea86c7fd05c19 (patch)
tree8eff8b36f895a11255bc1dc90610982c9ea0d61f
parentb287cb9033168e42b13feecbc3ffe3900afc1eb5 (diff)
downloadrepoze-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__.py11
-rw-r--r--repoze/lru/tests.py10
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):