创建一个装饰/缓存检查全局变量(Creating a decorator / cache for c

2019-10-30 03:07发布

我已经使用一些全局变量,以保持物体在整个库,例如,可以重复使用相当多的功能:

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))

有没有写这样的装饰,要检查全局变量的代码并不需要手动硬编码为每个的方式function*

如类似:

def exist_decorator(_object, _class):
    try:
        _object
    except NameError:
        _object = _class
    return _object

因此,对于实际的类实现function4()看起来像:

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

是这样的语法可能在Python与装饰? 如果没有,怎么我还能创建检查全局变量装饰/缓存?

Answer 1:

我猜你只是想缓存一些价值观。 对于这个体面的Python的直接法不滥用任何隐藏的功能是这样的:

cache = {}

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

和类似的其它功能。

您也可以尽量避免使用静态全局变量cache通过存储你的函数对象内的一切:

def function1(input):
    try:
        object1 = function1.object1
    except AttributeError:
        object1 = function1.object1 = Object1
    return object1.func1(input)

因为功能是任意的对象,您可以添加属性这是可能的。 但是,有人会认为这种滥用和不洁的代码。 一如往常,在这样的情况下,先用你的团队讨论这个问题,也许它在使用之前加入的这个团队或项目使用的技术列表。

我更喜欢使用的可变参数的隐藏功能:

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

这个工程在Python,因为列表作为函数参数的默认值仍然是可变的,将保持其价值。

再次,这可能被认为是不洁的滥用,因此指出,这种技术被用来在项目中使用它和文档之前与您的团队讨论这个问题。



文章来源: Creating a decorator / cache for checking global variable