summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2007-10-21 18:35:31 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2007-10-21 18:35:31 +0000
commitbab4fdc9fd1be47575f440816b4dfc422947d368 (patch)
treeb0c6db57e1ae118ab168a4dc5acdaea5733b24f6
parent2adcb3f250860172032f7762695e78f99415fa61 (diff)
Fixed #5560 -- Improved the way we create __str__ and __unicode__ methods in
lazy() objects. This fixes things for Jython and makes the code more readable, even for CPython. Thanks, Leo Soto. git-svn-id: http://code.djangoproject.com/svn/django/trunk@6587 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/utils/functional.py16
1 files changed, 7 insertions, 9 deletions
diff --git a/django/utils/functional.py b/django/utils/functional.py
index f4580e7bd5..e0c862b0b7 100644
--- a/django/utils/functional.py
+++ b/django/utils/functional.py
@@ -53,7 +53,11 @@ def lazy(func, *resultclasses):
self._delegate_unicode = unicode in resultclasses
assert not (self._delegate_str and self._delegate_unicode), "Cannot call lazy() with both str and unicode return types."
if self._delegate_unicode:
- self.__unicode__ = self.__unicode_cast
+ # Each call to lazy() makes a new __proxy__ object, so this
+ # doesn't interfere with any other lazy() results.
+ __proxy__.__unicode__ = __proxy__.__unicode_cast
+ elif self._delegate_str:
+ __proxy__.__str__ = __proxy__.__str_cast
def __promise__(self, klass, funcname, func):
# Builds a wrapper around some magic method and registers that magic
@@ -72,14 +76,8 @@ def lazy(func, *resultclasses):
def __unicode_cast(self):
return self.__func(*self.__args, **self.__kw)
- def __str__(self):
- # As __str__ is always a method on the type (class), it is looked
- # up (and found) there first. So we can't just assign to it on a
- # per-instance basis in __init__.
- if self._delegate_str:
- return str(self.__func(*self.__args, **self.__kw))
- else:
- return Promise.__str__(self)
+ def __str_cast(self):
+ return str(self.__func(*self.__args, **self.__kw))
def __cmp__(self, rhs):
if self._delegate_str: