线程安全的猴子修补

时间:2019-05-27 07:49:18

标签: python django django-models

在我们的Django应用中,我们有很多代码块,如果从数据库中获取的值为None,我们希望在其中引发异常。

我们当然可以为此行为编写一个自定义访问器,但是为了使那些代码块保持简单,我们用猴子Model进行了修补:

def raise_error_on_none_model_values(func):
    @wraps(func)
    def wrapped(*args, **kwargs):
        # execute function if already patched
        already_patched = (
            Model.__getattribute__ == _getattribute_raising_if_value_is_none
        )
        if already_patched:
            return func(*args, **kwargs)

        # patch
        Model.__getattribute__ = _getattribute_raising_if_value_is_none

        # execute function
        try:
            return func(**kwargs)
        finally:
            del Model.__getattribute__

    return wrapped

但是,(当然!)使用线程时会遇到问题。

我已经调查了诸如wrapt或gevent之类的库是否可以提供帮助,但是我不确定它们是否可以提供帮助。

是否可以制作线程安全的猴子补丁?有没有更好的方法来实现我们想要的目标?

0 个答案:

没有答案