按顺序智能地执行Python函数
我很好奇,在程序中使用装饰器调用函数来创建函数的有序映射,并在该映射中迭代,与直接按我想要的顺序调用函数相比,它们的相对优点是什么。下面是两个产生相同结果的示例:按顺序智能地执行Python函数,python,decorator,Python,Decorator,我很好奇,在程序中使用装饰器调用函数来创建函数的有序映射,并在该映射中迭代,与直接按我想要的顺序调用函数相比,它们的相对优点是什么。下面是两个产生相同结果的示例: PROCESS_MAP = {} def register(call_order): def decorator(process_func): PROCESS_MAP[call_order] = process_func return process_func return deco
PROCESS_MAP = {}
def register(call_order):
def decorator(process_func):
PROCESS_MAP[call_order] = process_func
return process_func
return decorator
@register(99)
def func3():
print 'last function'
@register(1)
def func0():
print 'first function'
@register(50)
def func1():
print 'middle function'
def main():
for func in sorted(PROCESS_MAP):
foo = PROCESS_MAP[func]
foo()
if __name__ == '__main__':
main()
这张照片是:
first function
middle function
last function
这比做下面的事情好吗
def func2():
print 'last function'
def func0():
print 'first function'
def func1():
print 'middle function'
def main():
func0()
func1()
func2()
if __name__ == '__main__':
main()
还有一些问题:
- 更像蟒蛇
- 比它的价值更多的工作
- 如果您没有正确分配订单,是否会导致太多问题
- 是否有更多的智能设计用于以正确的顺序调用函数
装饰程序中可能存在一个错误,它会自动删除与不同函数具有相同调用顺序号的函数。我说的是第二种方法,除非你想调用很多函数,而且懒得键入(如果你真的这么做,你的结构可能有问题)。它不仅更具可读性,从而有助于减少不必要的错误,而且更短。我说的是第二种方法,除非你想调用很多函数,而且懒得打字(如果你真的这么做,你的结构可能有问题)。它不仅更具可读性,从而有助于减少不必要的错误,而且更短。有一些有趣的实用程序,包括@before、@after装饰程序和一个有趣的系统,用于制定规则以强制执行某些行为 一个更简单的机制是为每个函数分配一个“权重”,然后按权重顺序对它们进行排序——尽管这假设函数的数组是单一的。如果存在层次结构,您可以对DAG进行拓扑排序,以获得节点的线性阵列。有一些有趣的实用程序,包括@before、@after装饰器和一个有趣的系统,用于制定规则以强制执行某些行为
一个更简单的机制是为每个函数分配一个“权重”,然后按权重顺序对它们进行排序——尽管这假设函数的数组是单一的。如果存在层次结构,您可以对DAG进行拓扑排序,以获得节点的线性阵列。第一个可以让您根据需要动态更改顺序,还可以让您更轻松地使用外部脚本更改顺序 如果你的程序逻辑清晰简单,或者有一天你的程序会变得更加复杂,而装饰师将变得无关紧要/需要进行重大更改以适应-使用第二个 您可以在此处阅读更多常用装饰: 但总而言之,我想说这真的取决于你的设计和项目的目的。
此外,如果选择第一种方式,我建议编写一个更好的机制来记录顺序、处理两个函数以及更多。这些改进可能会使decorator变得值得。第一个改进可以让您在需要时动态更改顺序,并且还可以让您更轻松地使用外部脚本更改顺序 如果你的程序逻辑清晰简单,或者有一天你的程序会变得更加复杂,而装饰师将变得无关紧要/需要进行重大更改以适应-使用第二个 您可以在此处阅读更多常用装饰: 但总而言之,我想说这真的取决于你的设计和项目的目的。
此外,如果选择第一种方式,我建议编写一个更好的机制来记录顺序、处理两个函数以及更多。这些改进可能会使decorator值得使用。这是一种使用decorator的非常聪明的方法,但我认为这会使您的程序逻辑更难遵循。如果函数必须始终以相同的顺序调用在一起,这表明它们就像一个长函数。这是一种使用decorator的非常聪明的方法,但我认为这会使你的程序逻辑更难遵循。如果函数必须总是以相同的顺序调用在一起,这表明它们就像一个长函数。如果你想根据参数调整函数顺序,或者如果你经常改变顺序,想使用脚本,如果你想根据一个参数调整函数的顺序,或者如果你经常改变顺序并且想使用脚本,那么第一个确实会给你带来好处