Python:缓存本地函数变量以供后续调用

Python:缓存本地函数变量以供后续调用,python,global-variables,local-variables,Python,Global Variables,Local Variables,在C/C++中,函数可以将局部变量声明为static。执行此操作时,该值将保留在内存中,并可供后续调用函数使用(此变量不再是局部变量,但它不在点的范围内) 有没有一种方法可以在Python中执行类似的操作,而不必在函数之外声明任何全局变量 用例:使用正则表达式从输入字符串中提取值的函数。我想预编译模式(re.compile()),而不必在函数范围之外声明变量 我可以将变量直接注入globals(): globals()['my_pattern']=re.compile(…) 但这看起来不是个好

在C/C++中,函数可以将局部变量声明为
static
。执行此操作时,该值将保留在内存中,并可供后续调用函数使用(此变量不再是局部变量,但它不在点的范围内)

有没有一种方法可以在Python中执行类似的操作,而不必在函数之外声明任何全局变量

用例:使用正则表达式从输入字符串中提取值的函数。我想预编译模式(
re.compile()
),而不必在函数范围之外声明变量

我可以将变量直接注入
globals()

globals()['my_pattern']=re.compile(…)

但这看起来不是个好主意。

您可以使用函数属性。在Python中,函数是一级对象,因此您可以滥用此功能来模拟静态变量:

重新导入
def查找某些模式(b):
如果getattr(查找某些模式“a”,无)为无:
查找\u一些\u pattern.a=re.compile(r'^[a-Z]+\\\(\d{1,2})$)
m=找到某种模式。a.匹配(b)
如果m不是无:
返回m.groups()[0]
返回“不匹配”
现在,您可以试试:

试试看:
打印(找到一些模式a)
除属性错误外:
print('还没有属性a!')
对于s in(“AAAA_1”、“aaa_1”、“BBBB_3”、“BB_333”):
打印(找到一些图案)
打印(找到一些模式a)
这是输出:

还没有属性!
初始化一个!
1.
没有对手
3.
没有对手
重新编译('^[A-Z]+\\\\\\\(\\d{1,2})$'))
这不是最好的方法(包装器或可调用项更优雅,我建议您使用其中一种),但我认为这清楚地解释了以下含义:

在Python中,函数是一级对象


为什么不直接上课呢?我不这么认为so@AbdulAzizBarkat在给定的上下文中,所有内容都是静态的(单个函数),类不会真正起作用。@JakubDóka我也是,但可能我遗漏了一些东西。你可以用一个装饰器来解决这个问题,缓存将发生在那里。你的个人资料看起来很有经验,所以我可以懒惰,不给你一个例子,我喜欢它比其他意见中建议的想法更好。