2017-03-22 1 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'] 목록이 있다고 가정하면 위의 코드 조각과 동일한 효과를 덜 반복적으로 얻을 수 있습니까?데코레이터로 반복 함수를 구현하는 Python 방법

DB에서이 목록을 얻습니다.이 목록에 더 많은 항목을 추가/제거하고 이에 해당하는 효과를 얻을 수있는 유연성이 필요합니다.

참고 : 여러 프레임 워크/아키텍처 제약 조건 내에서 작동하므로 예를 들어 "이 작업을 수행해야하는 경우 나쁜 아키텍처입니다."하지만 이렇게해야합니다. 가능한지 궁금해.

답변

0

mydecorator이나 logic에 무엇이 들어 있는지 알 수는 없지만 내 방법을이 도구로 전송할 수 있습니다. 이것은 당신이 원하는 일을 더 "파이썬"방법 :

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']) 
관련 문제