Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建用于检查全局变量的装饰器/缓存_Python_Global Variables_Decorator_Nameerror - Fatal编程技术网

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

Python 创建用于检查全局变量的装饰器/缓存,python,global-variables,decorator,nameerror,Python,Global Variables,Decorator,Nameerror,我有很多函数使用一些全局变量来保存要在整个库中重用的对象,例如: from some.other.lib import Object1, Object2, Object3, Object4, Object5 def function1(input): global _object1 try: _object1 except NameError: _object1 = Object1 return _object1.func1(in

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

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))
是否有一种编写装饰器的方法,使得检查全局变量的代码不需要为每个
函数*
手动硬编码

例如,类似于:

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中,这样的语法在使用decorators时是可能的吗?如果不是,我怎么才能创建一个decorator/cache来检查全局变量呢?

我想您只是想缓存一些值。为此,在不滥用任何隐藏特性的情况下,体面Python中的直接方法是:

cache = {}

def function1(input):
    try:
        object1 = cache['object1']
    except KeyError:
        object1 = cache['object1'] = Object1
    return object1.func1(input)
其他功能也类似

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

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中起作用,因为作为函数参数默认值的列表仍然是可变的,并且将保留其值


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

我想您只是想缓存一些值。为此,在不滥用任何隐藏特性的情况下,体面Python中的直接方法是:

cache = {}

def function1(input):
    try:
        object1 = cache['object1']
    except KeyError:
        object1 = cache['object1'] = Object1
    return object1.func1(input)
其他功能也类似

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

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中起作用,因为作为函数参数默认值的列表仍然是可变的,并且将保留其值


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

装饰者继续使用功能,不是在语句中。如果我假设你只是滥用全局变量来保持一种只在特定函数中使用的缓存,我是对的吗?或者您是否打算在
function1()
的范围之外使用
\u object1
?是的,我滥用它来缓存模型(更具体地说:),但我认为一定有更好的方法来实现这一点,但我不确定如何解耦模型,以使其保留在某个缓存中,以及当用户想要访问模型时。可能,缓存某种全局变量并将其传递给
lru\u cache
?和
\u object1
应该可以在
function1()的范围之外访问,不是在语句中。如果我假设你只是滥用全局变量来保持一种只在特定函数中使用的缓存,我是对的吗?或者您是否打算在
function1()
的范围之外使用
\u object1
?是的,我滥用它来缓存模型(更具体地说:),但我认为一定有更好的方法来实现这一点,但我不确定如何解耦模型,以使其保留在某个缓存中,以及当用户想要访问模型时。可能,缓存某种全局变量并将其传递给
lru\u cache
?和
\u object1
应该可以在
function1()
的范围之外访问。使用类似于“帮助”的方法可以吗?当然,有很多库(或只是代码片段)用于缓存值。但是,将其缓存在pickle文件中意味着将其缓存到进程运行时之外。下次启动此过程时,pickle文件可能仍然存在。你从来没有提到你想要这个功能,我的缓存版本也没有这样做过,所以我提到了这一点。你想使用帮助之类的东西吗?当然,有很多库(或者只是代码片段)用于缓存值。但是,将其缓存在pickle文件中意味着将其缓存到进程运行时之外。下次启动此过程时,pickle文件可能仍然存在。你从来没有说过你想要这个功能,我的缓存版本也没有这样做过,所以我提到了这一点。