Kaydet (Commit) bcef2834 authored tarafından Luke Plant's avatar Luke Plant

Fixed #12506 - 'lazy' fails when there are multiple expected classes with the same method

Thanks to Alex for report and patch



git-svn-id: http://code.djangoproject.com/svn/django/trunk@12104 bcc190cf-cafb-0310-a4f2-bffc1f526a37
üst 4d6c66d4
...@@ -167,9 +167,13 @@ def lazy(func, *resultclasses): ...@@ -167,9 +167,13 @@ def lazy(func, *resultclasses):
for resultclass in resultclasses: for resultclass in resultclasses:
cls.__dispatch[resultclass] = {} cls.__dispatch[resultclass] = {}
for (k, v) in resultclass.__dict__.items(): for (k, v) in resultclass.__dict__.items():
# All __promise__ return the same wrapper method, but they
# also do setup, inserting the method into the dispatch
# dict.
meth = cls.__promise__(resultclass, k, v)
if hasattr(cls, k): if hasattr(cls, k):
continue continue
setattr(cls, k, cls.__promise__(resultclass, k, v)) setattr(cls, k, meth)
cls._delegate_str = str in resultclasses cls._delegate_str = str in resultclasses
cls._delegate_unicode = unicode in resultclasses cls._delegate_unicode = unicode in resultclasses
assert not (cls._delegate_str and cls._delegate_unicode), "Cannot call lazy() with both str and unicode return types." assert not (cls._delegate_str and cls._delegate_unicode), "Cannot call lazy() with both str and unicode return types."
......
from unittest import TestCase
from django.utils.functional import lazy
class FunctionalTestCase(TestCase):
def test_lazy(self):
t = lazy(lambda: tuple(range(3)), list, tuple)
for a, b in zip(t(), range(3)):
self.assertEqual(a, b)
...@@ -12,6 +12,7 @@ import datastructures ...@@ -12,6 +12,7 @@ import datastructures
import itercompat import itercompat
from decorators import DecoratorFromMiddlewareTests from decorators import DecoratorFromMiddlewareTests
from functional import FunctionalTestCase
# We need this because "datastructures" uses sorted() and the tests are run in # We need this because "datastructures" uses sorted() and the tests are run in
# the scope of this module. # the scope of this module.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment