正确使用装饰器

时间:2018-02-24 19:55:03

标签: python python-decorators

我刚开始在Python中使用装饰器,我不确定如何正确使用它。

我们说我有这段代码:

def viable_decorator(fonction_viable):
    def viable(sequences, pos):
        codons = [seq[pos:pos+3] for seq in sequences]
        return not any("-" in codon for codon in codons)
    return viable

@viable_decorator
def viable(sequences, pos):
    codons = [seq[pos:pos+3] for seq in sequences]
    return not all("-" in codon for codon in codons)

sequncess = ["---aaacacaacaacaaat",
             "------aaacacacac---",
             "aaggcggaggcgg---ggg",]

print viable(sequences, 0)

我的目标是能够根据情况使用函数viable()的两个版本。这是装饰者应该如何工作的?如果是,我如何确定viable()函数的选择?因为现在,在这段代码中,总是调用装饰器。

提前致谢。

3 个答案:

答案 0 :(得分:4)

  

这是装饰者应该如何工作的吗?

没有。通常装饰器应该“装饰”原始函数,或者为原始函数添加一些额外的东西。 创建一个与装饰的无关的新文件。

在您的特定情况下:

def viable_decorator(fonction_viable):
    def viable(sequences, pos):
        codons = [seq[pos:pos+3] for seq in sequences]
        return not any("-" in codon for codon in codons)
    return viable

装饰器甚至不使用装饰函数fonction_viable。当然,这样做在语法上是有效的,但它不是正如名称所暗示的那样的装饰器。

答案 1 :(得分:1)

在Python3中,您可以使用functools.wraps创建viable的包装和解包版本:

import functools
def viable_decorator(fonction_viable):
  @functools.wraps(fonction_viable)
  def viable(sequences, pos):
    codons = [seq[pos:pos+3] for seq in sequences]
    return not any("-" in codon for codon in codons)
  return viable

@viable_decorator
def viable(sequences, pos):
   codons = [seq[pos:pos+3] for seq in sequences]
   return not all("-" in codon for codon in codons)

unwrapped_viable = viable.__wrapped__

在此示例中,调用viable将依次触发viable_decorator。但是,调用unwrapped_viable会在不触发viable的情况下调用viable_decorator

答案 2 :(得分:1)

装饰器实际上是将其他函数作为参数来添加功能的函数。你没有使用" fonction_viable"在任何地方,这类似于只是进行函数调用。

尝试将装饰器视为更高阶的实体,这些实体将添加某些功能,然后进行装饰。