【发布时间】:2014-09-27 10:13:11
【问题描述】:
我很好奇使用装饰器在程序中调用函数以创建函数的有序映射并遍历该映射,而不是按照我想要的顺序直接调用函数,有什么相对优点。以下是两个产生相同结果的示例:
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()
还有一些问题:
- 更 Pythonic?
- 工作量过大?
- 如果您没有正确分配订单,是否会引发太多问题?
- 是否有更智能的设计来以正确的顺序调用函数?
【问题讨论】:
-
这是一种使用装饰器的非常聪明的方式,但我认为它会使您的程序逻辑更难遵循。
-
如果函数必须始终以相同的顺序一起调用,这表明它们就像一个长函数。