[PYTHON] Eine einfache Möglichkeit, den Wert im Eigenschaftsdekorator zwischenzuspeichern. Schreibgeschützt. Beachten Sie, dass er so lange zwischengespeichert wird, bis das Objekt gelöscht wird.

def cached_ro_property(f):
    cache = [None]
    def _cached_ro_property(*args, **kargs):
        if cache[0]:
            return cache[0]
        cache[0] = f(*args, **kargs)
        return cache[0]
    return property(_cached_ro_property)


from django.test import TestCase
import mox


class TestCachedRoProperty(TestCase):
    """Test for cached_ro_property decorator."""
    
    def setUp(self):
        self.m = mox.Mox()

    def tearDown(self):
        self.m.UnsetStubs()
        self.m = None

    def test_call_1(self):
        """Simple call."""

        from decorators import cached_ro_property

        # Procuder function that should be called once.
        producer = self.m.CreateMockAnything()
        producer().AndReturn(30)

        class C(object):
            @cached_ro_property
            def f(self):
                return producer()

        self.m.ReplayAll()
        c = C()

        self.assertEqual(c.f, 30)
        self.assertEqual(c.f, 30)
        self.m.VerifyAll()

    def test_call_2(self):
        """Check that property function reference self."""

        from decorators import cached_ro_property

        # Procuder function that should be called once.
        producer = self.m.CreateMockAnything()
        producer().AndReturn(30)

        class C(object):
            @cached_ro_property
            def f(self):
                return self.g()
            def g(self):
                return producer()

        self.m.ReplayAll()
        c = C()

        self.assertEqual(c.f, 30)
        self.assertEqual(c.f, 30)
        self.m.VerifyAll()

Recommended Posts

Eine einfache Möglichkeit, den Wert im Eigenschaftsdekorator zwischenzuspeichern. Schreibgeschützt. Beachten Sie, dass er so lange zwischengespeichert wird, bis das Objekt gelöscht wird.
Ein einfacher Grund, warum der Rückgabewert von round (2.675,2) in Python 2,67 beträgt (in Wirklichkeit sollte er 2,68 betragen ...)
Ein einfacher Mock-Server, der den HTTP-Anforderungsheader einfach in den Hauptteil der Antwort einbettet und zurückgibt.
Erstellen Sie eine einfache App, die die Fetch-API für Ajax-Anforderungen in Flask enthält, und erklären Sie sie schnell.
Der Hintergrund der Zeichen im Textbild ist überbelichtet, um das Lesen zu erleichtern.
Ein Skript, das so lange sucht, bis die entsprechende URL mit einem Hatena-Lesezeichen versehen ist
[Hinweis] Ein Shell-Skript, das die CPU-Auslastung eines bestimmten Prozesses in einer while-Schleife überprüft.