我刚开始在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()
函数的选择?因为现在,在这段代码中,总是调用装饰器。
提前致谢。
答案 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"在任何地方,这类似于只是进行函数调用。
尝试将装饰器视为更高阶的实体,这些实体将添加某些功能,然后进行装饰。