我有一个可以简化如下的问题:我有一组特定的对象,我想以特定的方式修改它们。因此,我可以编写一个修改单个对象的函数,然后创建一个将该函数应用于集合中所有对象的装饰器。
所以,假设我有这样的东西:
def modify_all(f):
def fun(objs):
for o in objs:
f(o)
@modify_all
def modify(obj):
# Modify obj in some way.
modify(all_my_objs)
但是,有时我可能只想单独操作一个对象。
有没有办法以编程方式“取消装饰”修改
函数以再次恢复原始(单个对象)函数? (我的意思是,不只是删除装饰器。)或者在这种情况下是否有另一种方法更好使用?
为了清楚和完整起见,实际 modify_all
装饰器中发生的事情比此处所示的要多得多。 modify
和 modify_all
都需要执行一定量的工作,这就是为什么我认为装饰器可能不错。此外,我还有其他 modify
变体,它们可以直接受益于 modify_all
,这使得它更加有用。但有时我确实需要使用原始的 modify
函数来做一些事情。我知道我总是可以传入一个单元素集来“欺骗”它按原样工作,但我想知道是否有更好的方法或针对这种情况的更好的设计。
最佳答案
手动将装饰器应用到函数一次,并将结果保存为新名称。
def modify_one(obj):
...
modify_some = modify_all(modify_one)
modify_some([a, b, c])
modify_one(d)
关于Python设计问题(在这种情况下可以/应该使用装饰器吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3473746/