2017-12-29 5 views
0

데코레이터를 배우려고하기 때문에 특정 태그 안에 내용을 작성하려고하는 다음 예제를 구현했습니다.데코레이터 기능이 두 개의 인수를 사용할 때

def content_decoration(func1): 
    def inner_function(name, c_decorator, tag): 
     return '<{1}> {0} </{1}>'.format(func1(name, c_decorator), tag) 
    return inner_function 

@content_decoration 
def return_decorated_content(content , con_decorator): 
    return '{0} {1}'.format(content, con_decorator) 

return_decorated_content('Content', ' content_addition', 'p') 

위의 명령의 출력은 다음과 같습니다 '<p> Content content_addition </p>'

그러나 나는 그것이 조금 어렵다고 생각 나는 내용과 태그 자체 모두를 장식해야 할 때.

def decoration(func1, func2): 
    def inner_function(content, tag, content_decoration=None, tag_decoration=None): 
     return '<{1}> {0} </{1}>'.format(func1(content, content_decoration), func2(tag, tag_decoration)) 
    return inner_function 

def name_decoration(con, con_decor): 
    return '{0} {1}'.format(con, con_decor) 

def tag_decoration(tag, tag_decor): 
    return '{0} {1}'.format(tag, tag_decor) 

장식을 사용하지 않고 우리가 가진 것 :

print decoration(name_decoration, tag_decoration)(content='Alice', tag='h1', tag_decoration='fontsize=12', content_decoration='') 
# or 
print 
function = decoration(name_decoration, tag_decoration) 
print function(content='Bob', content_decoration='Smith', tag='p') 

산출 : 예를 들어, 우리는 다음과 같은 코드가

<h1 fontsize=12> Alice </h1 fontsize=12> 

<p None> Bob Smith </p None> 

을하지만 어떻게 동일한 결과를 얻을 수 있습니다 파이썬 통사론 설탕을 사용하고 있습니까?

+0

중복 가능성 : https://stackoverflow.com/q/5929107/1256452 – torek

+0

[매개 변수가있는 데코레이터?] (https://stackoverflow.com/questions/5929107/decorators-with-parameters) 중복 가능성 있음 –

답변

1

당신은 장식 할 수있는 기능 위의 nametag 기능을 선언하고 외부 장식에 매개 변수로 전달할 수 있습니다

def decoration(func1, func2): 
    def wrapper(f1): 
    def inner_function(content, tag, content_decoration=None, tag_decoration=None): 
     return '<{1}> {0} </{1}>'.format(func1(content, content_decoration), func2(tag, tag_decoration)) 
    return inner_function 
    return wrapper 

def name_decoration(con, con_decor): 
    return '{0} {1}'.format(con, con_decor) 

def tag_decoration(tag, tag_decor): 
    return '{0} {1}'.format(tag, tag_decor) 

@decoration(name_decoration, tag_decoration) 
def get_html(content, tag, content_decoration=None, tag_decoration=None): 
    return 

print(get_html(content='Alice', tag='h1', tag_decoration='fontsize=12', content_decoration='')) 
print(get_html(content='Bob', content_decoration='Smith', tag='p')) 

출력 :

<h1 fontsize=12> Alice </h1 fontsize=12> 
<p None> Bob Smith </p None> 

또는, lambda 기능을 사용할 수 있습니다 공간 절약을 위해 :

@decoration(lambda con, con_decor:'{0} {1}'.format(con, con_decor), lambda tag, tag_decor:'{0} {1}'.format(tag, tag_decor)) 
def get_html(content, tag, content_decoration=None, tag_decoration=None): 
    return 
+0

감사합니다. – thanasissdr

관련 문제