2012-04-12 34 views
3

Während dieser article kürzlich auf Python-Dekoratoren zu lesen, gab es als Beispiel die Technik memoization als eine Anwendung von Python Dekoratoren. Während ich ein funktionierendes Verständnis von Python-Dekoratoren habe, möchte ich von mehr solchen effektiven Anwendungsfällen für Dekorateure wissen, und wie Sie sie normalerweise in Ihrem alltäglichen Code verwenden.Typische Anwendungs- und Anwendungsfälle für Python-Dekorierer

+0

möglich Duplikat [Was für memoization gut ist, und es ist alles wirklich so hilfreich?] (Http://stackoverflow.com/questions/3242597/what-is-memoization-good-for-and-is -it-wirklich-all-das-hilfreich) – detly

+0

Ich realisiere, dass Duplikat nicht Python-spezifisch ist, aber ich denke, es beantwortet Ihre Frage. – detly

+1

@detly Eigentlich nein, meine Frage geht überhaupt nicht um Memoisierung, ich wollte nur mit einem Beispiel illustrieren. Meine Frage bezieht sich speziell auf Python Decorators und ihre guten Anwendungsfälle wie Memoization – subiet

Antwort

0

Sie können effektive Anwendungsfälle für Python-Dekoratoren im Django-Webframework authdocs betrachten. Klare Beispiele (die ich persönlich jeden Tag benutze) beinhalten die Verwendung von Dekorierern für restricting views to authenticated users, restricting access depending on specific user permissions, usw.

+1

Zur Erleichterung der anderen @ Josvic Antwort möglicherweise beziehen sich auf [diese] (https://docs.djangoproject.com/en/dev/topics/http/decorators/) unter anderem. – subiet

+0

@subset Genau. Ich habe mich gerade auf spezifische bezogen, die ich wirklich nützlich finde :) –

+0

Danke für die Bearbeitung der Antwort :) – subiet

0

Dies ist ein praktisches Beispiel. Sieh dir Fibonaccis Seriensumme mit und ohne Memo an.

from functools import wraps 
def memo(func): 
    cache = {} 
    @wraps(func) 
    def wrap(*args): 
     if args not in cache: 
      cache[args] = func(*args) 
     return cache[args] 
    return wrap 

def fib(i): 
    if i < 2: return 1 
    return fib(i-1) + fib(i-2) 

@memo 
def fib_memo(i): 
    if i < 2: return 1 
    return fib_memo(i-1) + fib_memo(i-2) 

Und jetzt testen Sie die Geschwindigkeitsdifferenz!

>>> print fib(200) 
... 
>>> print fib_memo(200) 
... 
+0

Dies ist das genaue Beispiel, das ich in dem Link in der Frage erwähne. Die Nützlichkeit der Dekorateure in diesem Szenario veranlasste mich, weitere Anwendungsfälle wie diese zu suchen :) – subiet

+0

@subiet Ich habe den Artikel nicht gelesen, klassisches Beispiel, es scheint fast wie eine exakte Kopie einfügen :). Wie auch immer, wenn Sie mit Algorithmen, Knoten und Graphen arbeiten, wird memo verwendet, um die sogenannte rekursive Komplexität zu entfernen (besonders nützlich bei der Partitionierung und Suche). – luke14free

2

Es gibt eine Reihe von Einbau-Dekorateure, die nützlich sein können, wie classmethod, property, staticmethod und functools.wrap. Es ist oft praktisch, einen Dekorator zu schreiben, der die Verwendung von Funktionen für Debugging-Zwecke protokolliert. Es gibt viele Beispiel-Dekoratoren auf this Python wiki page, obwohl ich denke, zumindest einige von diesen sind mehr darauf ausgerichtet, zu zeigen, wie flexibel Python ist, als tatsächlich nützliche Funktionalität zu bieten.

1

Da Python 3 Typ Anmerkungen unterstützt, können Dekoratoren als eine Möglichkeit zur Überprüfung verwendet werden.

def check(f): 
    def _f(x): 
     if type(x) != f.__annotations__['x']: 
      raise TypeError(type(x)) 
     val = f(x) 
     if 'return' in f.__annotations__ and f.__annotations__['return'] != type(val): 
      raise TypeError(type(val)) 
     return val 
    return _f 

@check 
def f(x: int) -> int: 
    return x * 2 

>>> f(2) 
4 

>>> f('x') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 4, in _f 
TypeError: <class 'str'> 
Verwandte Themen