我有很多函数使用一些全局变量来保存要在整个库中重用的对象,例如:
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中,这样的语法是可能的吗?如果没有,我如何创建一个装饰器/缓存来检查全局变量?在
我想你只是想缓存一些值。为此,体面的Python中不滥用任何隐藏功能的直接方法是:
其他功能也一样。在
您还可以通过将所有内容存储在函数对象中来避免使用静态全局变量
^{pr2}$cache
:这是可能的,因为函数是可以添加属性的任意对象。但有些人可能会称之为虐待和不洁的代码。在这种情况下,首先与您的团队讨论这一点,并在使用之前将其添加到该团队或项目使用的技术列表中。在
我更喜欢使用可变参数的隐藏特性:
这在Python中是可行的,因为作为函数参数的默认值的列表仍然是可变的,并将保留其值。在
同样,这可能被认为是不干净和滥用,所以在使用它之前,请与您的团队讨论这一点,并在您的项目中记录使用这种技术的情况。在
相关问题 更多 >
编程相关推荐