파 이 썬 학습 노트-decorator
2037 단어 Python 학습
소결:1.함수 호출 전후
'begin call'
와'end call'
로 그 를 출력 할 수 있 는 decorator 를 작성 하 십시오.import functools def log(f): @functools.wraps(f) def wrapper(*args,**kw): print 'begin call' return f(*args,**kw) print 'end call' return wrapper @log def f(): print 'Function is processing'
결과:시작 하기 전에 begin call 을 인쇄 하지만 끝 난 후에 end call 은 없습니다.분석 원인:return f(*args,*kw)문 구 를 인쇄 할 때 대응 하 는 f 함수 가 되 돌 아 왔 고,'end call'은 로그(f)를 처음(초기 화 할 때)에 만 실 행 됐 으 며,매번 f()를 호출 할 때마다 이 문 구 를 실행 하지 않 았 습 니 다.해결 방법 을 잠시 찾 지 못 했다.
----------------------------------------------------------------------------------------------------------------------------------------
해결책 을 찾 았 다 문장 return f(*args,**kw)는 실제 적 으로 f()를 먼저 연산 한 다음 에 얻 은 값 을 되 돌려 주기 때문에 쓰기 만 하면 된다.
val = f(*args,**kw)
print 'end call'
return val
하면 돼!
----------------------------------------------------------------------------------------------------------------------------------------
2.
@log
의 decorator 를 써 서 지원 할 수 있 습 니까?@log
def f():
pass
또 지원:@log('execute')
def f():
pass
import functools def log(text): if type(text) == str: def decorator(f): @functools.wraps(f) def wrapper(*args,**kw): print '%s "%s"'%(f.__name__,text) return f(*args,**kw) return wrapper return decorator else: f = text @functools.wraps(f) def wrapper(*args,**kw): print '%s'%(f.__name__) return f(*args,**kw) return wrapper 좀 복잡 하 게 써 서 더 간소화 할 수 있 을 지 생각 나 지 않 았 다.매개 변 수 를 입력 한 후 먼저 실제 인삼 유형 을 판단 하여 log(f)인지 log('execute')(f)인지 구별 하여 3 층 끼 워 넣 는 지 2 층 끼 워 넣 는 장식 기 인지 확인 합 니 다.