装饰器函数接受两个参数时的装饰器

时间:2017-12-29 01:14:28

标签: python python-decorators

我正在尝试学习装饰器,所以我实现了以下示例,其中我尝试在特定标记内创建内容。

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>

但是如何使用python语法糖实现相同的结果呢?

1 个答案:

答案 0 :(得分: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