Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按顺序智能地执行Python函数_Python_Decorator - Fatal编程技术网

按顺序智能地执行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()
还有一些问题:

  • 更像蟒蛇
  • 比它的价值更多的工作
  • 如果您没有正确分配订单,是否会导致太多问题
  • 是否有更多的智能设计用于以正确的顺序调用函数
在我能想到的所有情况下,我更喜欢第二种(非装饰性)方法。显式命名函数是直接、明显和清晰的。考虑一个问题:“这个函数是从哪里调用的”,以及如何在每种情况下回答这个问题。< /P> 您的decorator中可能存在一个错误,它会自动删除与不同函数具有相同调用顺序号的函数。

在我能想到的所有情况下,我更喜欢第二种(非修饰)方法。显式命名函数是直接、明显和清晰的。考虑一个问题:“这个函数是从哪里调用的”,以及如何在每种情况下回答这个问题。< /P>
装饰程序中可能存在一个错误,它会自动删除与不同函数具有相同调用顺序号的函数。

我说的是第二种方法,除非你想调用很多函数,而且懒得键入(如果你真的这么做,你的结构可能有问题)。它不仅更具可读性,从而有助于减少不必要的错误,而且更短。

我说的是第二种方法,除非你想调用很多函数,而且懒得打字(如果你真的这么做,你的结构可能有问题)。它不仅更具可读性,从而有助于减少不必要的错误,而且更短。

有一些有趣的实用程序,包括@before、@after装饰程序和一个有趣的系统,用于制定规则以强制执行某些行为

一个更简单的机制是为每个函数分配一个“权重”,然后按权重顺序对它们进行排序——尽管这假设函数的数组是单一的。如果存在层次结构,您可以对DAG进行拓扑排序,以获得节点的线性阵列。

有一些有趣的实用程序,包括@before、@after装饰器和一个有趣的系统,用于制定规则以强制执行某些行为


一个更简单的机制是为每个函数分配一个“权重”,然后按权重顺序对它们进行排序——尽管这假设函数的数组是单一的。如果存在层次结构,您可以对DAG进行拓扑排序,以获得节点的线性阵列。

第一个可以让您根据需要动态更改顺序,还可以让您更轻松地使用外部脚本更改顺序

如果你的程序逻辑清晰简单,或者有一天你的程序会变得更加复杂,而装饰师将变得无关紧要/需要进行重大更改以适应-使用第二个

您可以在此处阅读更多常用装饰:

但总而言之,我想说这真的取决于你的设计和项目的目的。
此外,如果选择第一种方式,我建议编写一个更好的机制来记录顺序、处理两个函数以及更多。这些改进可能会使decorator变得值得。

第一个改进可以让您在需要时动态更改顺序,并且还可以让您更轻松地使用外部脚本更改顺序

如果你的程序逻辑清晰简单,或者有一天你的程序会变得更加复杂,而装饰师将变得无关紧要/需要进行重大更改以适应-使用第二个

您可以在此处阅读更多常用装饰:

但总而言之,我想说这真的取决于你的设计和项目的目的。
此外,如果选择第一种方式,我建议编写一个更好的机制来记录顺序、处理两个函数以及更多。这些改进可能会使decorator值得使用。

这是一种使用decorator的非常聪明的方法,但我认为这会使您的程序逻辑更难遵循。如果函数必须始终以相同的顺序调用在一起,这表明它们就像一个长函数。这是一种使用decorator的非常聪明的方法,但我认为这会使你的程序逻辑更难遵循。如果函数必须总是以相同的顺序调用在一起,这表明它们就像一个长函数。如果你想根据参数调整函数顺序,或者如果你经常改变顺序,想使用脚本,如果你想根据一个参数调整函数的顺序,或者如果你经常改变顺序并且想使用脚本,那么第一个确实会给你带来好处