繁体   English   中英

Python:仅在本地装饰函数的最佳方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM