【发布时间】:2021-08-10 15:41:29
【问题描述】:
我知道上下文管理器和装饰器在 Python 中是两个完全不相关的概念,但两者都可以用来实现相同的目标。有时可能会混淆哪一个是最佳实践。 在 Maya 中,如果您希望将操作列表分组为撤消队列的单个元素,则需要打开和关闭块。这是非常危险的,因为如果在块打开时引发异常,它可能会完全破坏撤消队列。
假设我想在 undo 块打开时执行以下代码:
def do_stuff():
print("I do stuff...")
一种方法是写:
cmds.undoInfo(openChunk=True)
try:
do_stuff()
finally:
cmds.undoInfo(closeChunk=True)
这显然是一次性的解决方案,不太实用。我知道我可以将它作为装饰器自动化:
def open_undo_chunk(func):
def wrapper():
cmds.undoInfo(openChunk=True)
print("chunck opened")
func()
cmds.undoInfo(closeChunk=True)
print("chunck closed")
return wrapper
@open_undo_chunk
def do_stuff():
print("I do stuff...")
do_stuff()
但另一种方法是使用上下文管理器。
class Open_undo_chunk():
def __enter__(self):
cmds.undoInfo(openChunk=True)
print("chunck opened")
return
def __exit__(self, exec_type, exec_val, traceback):
cmds.undoInfo(closeChunk=True)
print("chunck closed")
with Open_undo_chunk():
do_stuff()
在这种情况下,哪一个是最佳实践?为什么?
【问题讨论】:
标签: python decorator maya undo contextmanager