创建用于检查全局变量的装饰器/缓存

2024-06-16 11:41:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有很多函数使用一些全局变量来保存要在整个库中重用的对象,例如:

from some.other.lib import Object1, Object2, Object3, Object4, Object5

def function1(input):
    global _object1
    try:
        _object1
    except NameError:
        _object1 = Object1
    return _object1.func1(input)


def function2(input):
    global _object2
    try:
        _object2
    except NameError:
        _object2 = Object2
    # Use function1 to do something to the input
    return _object2.func2(function1(input))


def function3(input):
    global _object3
    try:
        _object3
    except NameError:
        _object3 = Object3
    # Use function1 to do something to the input.
    return _object3.func3(function1(input))


def function4(input):
    global _object4
    try:
        _object4
    except NameError:
        _object4 = Object4
    return _object4.func4(input)


def function5(input):
    global _object5
    try:
        _object5
    except NameError:
        _object5 = Object5
    # Use function4 to do something to the input.
    return _object5.func5(function4(input))

有没有一种方法可以编写一个decorator,使得检查全局变量的代码不需要为每个function*手动硬编码?在

例如:

^{pr2}$

因此,function4()的实际类实现如下所示:

def function4(input):
    global _object4
    exist_decorator(_object4, Object4)
    return _object4.func4(input)

在Python和decorator中,这样的语法是可能的吗?如果没有,我如何创建一个装饰器/缓存来检查全局变量?在


Tags: toinputreturndefglobaltryexceptobject1
1条回答
网友
1楼 · 发布于 2024-06-16 11:41:55

我想你只是想缓存一些值。为此,体面的Python中不滥用任何隐藏功能的直接方法是:

cache = {}

def function1(input):
    try:
        object1 = cache['object1']
    except KeyError:
        object1 = cache['object1'] = Object1
    return object1.func1(input)

其他功能也一样。在

您还可以通过将所有内容存储在函数对象中来避免使用静态全局变量cache

^{pr2}$

这是可能的,因为函数是可以添加属性的任意对象。但有些人可能会称之为虐待和不洁的代码。在这种情况下,首先与您的团队讨论这一点,并在使用之前将其添加到该团队或项目使用的技术列表中。在

我更喜欢使用可变参数的隐藏特性:

def function(input, object1Cache=[None]):
    if object1Cache[0] is None:
        object1Cache[0] = Object1
    return object1Cache[0].func1(input)

这在Python中是可行的,因为作为函数参数的默认值的列表仍然是可变的,并将保留其值。在

同样,这可能被认为是不干净和滥用,所以在使用它之前,请与您的团队讨论这一点,并在您的项目中记录使用这种技术的情况。在

相关问题 更多 >