[英]Python: Best way to decorate a function only locally
装饰功能的最佳方法是什么,但仅限于本地范围。 例如,我们有以下内容:
def a():
do stuff
b()
do stuff
我想打一个函数c()
做同样的stuff
但装饰B上它增加了一些额外的东西。 我找到了一种方法,但是它会全局更改b():
def c():
global b
b = decorator(b)
a()
有没有办法在不全局更改功能b的情况下执行此操作?
您可以修补函数b
,然后将其替换为另一个函数。 在Python 3中使用unittest.mock
或在Python 2中进行mock
:
from unittest.mock import patch
def c():
with patch('b', decorator(b)):
a()
# Or, as a decorator
@patch('b', decorator(b))
def c():
a()
通过打补丁,您实际上是在用自己的实例替换b
实例。
Python允许任何对象都是可调用的,而不仅仅是函数。
您可以使用类似:
class A(object):
def __init__(self, func=b):
self.func = func
def __call__(self):
# do stuff
self.func()
# do other stuff
然后使用a = A()
, a()
将简单地调用f
但是如果您编写c = A(decorator(b))
, c()
将调用修饰的版本
由于您要重新绑定b()
以便调用a()
将尊重更新的b()
,因此您可以保存原始的b()
,然后将其还原。 这可能不是最有效的方法,但是对我有用。
import copy
def c():
global b
orig_b = copy.deepcopy(b)
b = decorator(b)
a()
b = orig_b
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.