42.8데코레이션 심사문제
, Lee Jung님이 작성데코레이션 심사문제를 푸는데 데코레이션의 인수가 결과랑 동일하게 잘 나오지 않아서 질문드립니다. 인수를 두번 해서 표현하면 동일한 인수가 두번 나오고 분리해서 적용하면 함수가 2번 나와서 Hello, world!결과가 두번이 됩니다.
검토하기를 보고 적용해도 잘 모르겠어서 질문드립니다.
def html_tag(tag_name):
def real_decorator(func):
def wrapper():
r=func()
print('<{0}><{2}>{1}</{2}></{0}>'.format(tag_name,r,tag_name),end=' ')
return r
return wrapper
return real_decorator
Re: 42.8데코레이션 심사문제
, 도장_ 관리자님이 작성반환값이 없는 데코레이터이기 때문에 UNIT 42.1.1의 예제를 이용하면 됩니다.
r = func()
return r
을 사용하는 것은 반환값이 있는 데코레이터일 때 입니다.
문제에서는 데코레이터 안에서 매개변수는 받지만, 반환값은 없습니다.
UNIT 42.1.1 예제는 매개변수를 받지 않는데, 이 예제를 매개변수를 받는 wrapper 함수를 사용하면 됩니다.
심사문제 해설을 보면
즉, '<{0}>{1}</{0}>'.format(tag_name, func())과 같이 문자열 서식을 사용하거나 +를 사용하여 '<', '>', '/', tag_name, func()를 조합해주면 됩니다.
즉,
print('<{0}><{2}>{1}</{2}></{0}>'.format(tag_name,r,tag_name),end=' ')
문의한 코드처럼 이렇게 접근하면 안 됩니다.
return '<{0}>{1}</{0}>'.format(tag_name, func())
이렇게 작성하라는 겁니다. 정답 코드입니다. 심사문제 해설을 벗어나서 동작하는 코드를 제출할 수는 있겠지만, 매우 어려워질 겁니다. 일반적인 코드가 아니라는 뜻이니까요.데코레이터를 전체적으로 복습하고, 유형별로 나눠서 이해하세요.
데코레이터는 고급 기능이라 이해가 어렵습니다.