2017-10-23 7 views
2

Ich versuche, zwei Dekorateure zu verketten. aber einige, wie am Ende läuft nur einer. kann jemand mir Lösung für das drucken hello John!Verkettung Dekoratoren

def decorator_redis(func_name): 
    def redis_decorator(func): 
     @wraps(func) 
     def redis_wrapper(*args): 
      redis_utilty = RedisUtilties() 
      entity_id = args[0] 
      return 'hello' + entity_id 
     return redis_wrapper 
    return redis_decorator 

def decorator_ES(func_name): 
    def ES_decorator(func): 
     @wraps(func) 
     def ES_wrapper(*args): 
      return args[0]+ '!' 
     return ES_wrapper 
    return ES_decorator 

@decorator_redis('find') 
@decorator_ES('find') 
def fetch_entity(name): 
    return 

print(fetch_entity('John')) 

Ich brauche vorschlagen. Aber in der Lage, hello John oder John ! auszudrucken, abhängig davon, welchen Dekorator ich einzeln verwendete.

+1

Ihre Einrückung scheint falsch zu sein. Bitte reinige deinen Code. –

+0

Warum haben Sie Dekorateurfabriken? Keiner Ihrer Dekoratoren verwendet den Parameter 'func_name'. –

+0

Das grundlegende Problem ist, dass keiner der Wrapper das Original 'func()' aufruft; Sie haben die dekorierte Funktion effektiv umgangen. –

Antwort

0

Sie sollten die eingerichtete Funktion in der Wrapper Dekoratorklasse nennen (jede von ihnen):

def decorator_ES(func_name): 
    def ES_decorator(func): 
     @wraps(func) 
     def ES_wrapper(*args): 
      return func(args[0]+ '!') # <-- HERE 
     return ES_wrapper 
    return ES_decorator 

Das Gleiche gilt für einen anderen Dekorateur.

Ansonsten, Sie effektiv ersetzen die Funktion mit der neuesten (obersten) Wrapper. Also, wenn Sie es aufrufen, kommt es nie zum unteren Dekorator oder zur Funktion selbst.