2017-03-22 39 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 

注意模式和重複性? 假設我有一個清單['foo','bar','lorem','ipsum','abc','xyz'],如何才能以較少重複的方式達到與上述代碼片段相同的效果?Pythonic的方式來實現與裝飾重複功能

我獲得來自DB這個名單,我需要添加/在這個列表中刪除多個項目,並獲得相應的效果的靈活性。

注:我內的幾個框架/架構的限制操作,所以是的,「如果你有這樣做是不好的建築」,但是這是我需要做的。我想知道是否有可能。

回答

0

我不知道你的mydecoratorlogic中有什麼,但我的方法可以轉移到它。這是做你想要什麼更「Python化」的方式:

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

一種方法是使用嵌套的高清創建關閉該因子出公共代碼。然後,使用map()將函數應用於各種固定參數:

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'])