2017-03-22 4 views
0
@mydecorator('foo') 
def foo(): 
    logic('foo') 
    return True 

@mydecorator('bar') 
def bar(): 
    logic('bar') 
    return True 

@mydecorator('lorem') 
def lorem(): 
    logic('lorem') 
    return True 

@mydecorator('ipsum') 
def ipsum(): 
    logic('ipsum') 
    return True 

@mydecorator('abc') 
def abc(): 
    logic('abc') 
    return True 

@mydecorator('xyz') 
def xyz(): 
    logic('xyz') 
    return True 

Beachten Sie das Muster und die Wiederholbarkeit? Angenommen, ich habe eine Liste ['foo','bar','lorem','ipsum','abc','xyz'], wie kann ich den gleichen Effekt wie das obige Code-Snippet auf weniger repetitive Weise erreichen?Pythonic Weg, sich wiederholende Funktionen mit Dekoratoren zu implementieren

Ich bekomme diese Liste von einer DB, ich brauche die Flexibilität des Hinzufügens/Entfernens mehr Elemente in dieser Liste und das Erreichen der entsprechenden Wirkung.

HINWEIS: Ich arbeite innerhalb mehrerer Rahmenwerk/Architektur-Einschränkungen, also ja, "wenn Sie dies tun müssen, ist es schlechte Architektur", aber das ist, was ich tun muss. Ich frage mich, ob es möglich ist.

Antwort

0

Ich weiß nicht, was in Ihrem mydecorator noch logic ist, aber meine Methode könnte darauf übertragen werden. Dies ist eine „pythonic“ Art und Weise zu tun, was Sie wollen:

from functools import wraps 

def mydecorator(func): 
    @wraps(func) 
    def decorated(*args, **kwargs): 
     print("In mydecorator: called by: "+func.__name__) 
     return func(func.__name__, *args, **kwargs) 
    return decorated 

@mydecorator 
def foo(name): 
    logic(name) 
    return True 

@mydecorator 
def bar(name): 
    logic(name) 
    return True 

@mydecorator 
def lorem(name): 
    logic(name) 
    return True 

@mydecorator 
def ipsum(name): 
    logic(name) 
    return True 


def logic(name): 
    print("In logic: called by: "+name) 
0

Einen Ansatz ist es, einen verschachtelten-def verwenden Schließungen erstellen den gemeinsamen Code, die Faktor-out. Verwenden Sie dann map(), um die Funktion auf die verschiedenen festen Argumente anzuwenden:

def make_decorated(s): 
    def inner(): 
     logic(s) 
     return True 
    return mydecorator(s)(inner) 

foo, bar, lorem, ipsum = map(make_decorated, ['foo', 'bar', 'lorem', 'ipsum']) 
Verwandte Themen