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文件可能仍然存在。你从来没有说过你想要这个功能,我的缓存版本也没有这样做过,所以我提到了这一点。