Python:缓存一个局部函数变量,供后续调用
Python: cache a local function variable for subsequent calls
在C/C++中,函数可以将局部变量声明为static
。这样做时,该值保留在内存中,可供后续调用该函数使用(该变量不再是本地变量,但这不是重点)。
有没有办法在 Python、 中做类似的事情,而不必 在函数外声明任何全局变量?
用例:一个函数(除其他外)使用正则表达式从输入字符串中提取值。我想预编译模式 (re.compile()
),而不必在函数范围之外声明变量。
我可以直接注入一个变量到globals()
:
globals()['my_pattern'] = re.compile(...)
但这看起来不是个好主意。
您可以使用函数属性。在Python中,函数是first-class对象,所以你可以滥用这个特性来模拟一个静态变量:
import re
def find_some_pattern(b):
if getattr(find_some_pattern, 'a', None) is None:
find_some_pattern.a = re.compile(r'^[A-Z]+\_(\d{1,2})$')
m = find_some_pattern.a.match(b)
if m is not None:
return m.groups()[0]
return 'NO MATCH'
现在,你可以试试看:
try:
print(find_some_pattern.a)
except AttributeError:
print('No attribute a yet!')
for s in ('AAAA_1', 'aaa_1', 'BBBB_3', 'BB_333'):
print(find_some_pattern(s))
print(find_some_pattern.a)
这是输出:
No attribute a yet!
initialize a!
1
NO MATCH
3
NO MATCH
re.compile('^[A-Z]+\_(\d{1,2})$')
这不是最好的方法(包装器或可调用对象更优雅,我建议您使用其中之一),但我认为这清楚地解释了以下含义:
In Python, functions are first-class objects.
在C/C++中,函数可以将局部变量声明为static
。这样做时,该值保留在内存中,可供后续调用该函数使用(该变量不再是本地变量,但这不是重点)。
有没有办法在 Python、 中做类似的事情,而不必 在函数外声明任何全局变量?
用例:一个函数(除其他外)使用正则表达式从输入字符串中提取值。我想预编译模式 (re.compile()
),而不必在函数范围之外声明变量。
我可以直接注入一个变量到globals()
:
globals()['my_pattern'] = re.compile(...)
但这看起来不是个好主意。
您可以使用函数属性。在Python中,函数是first-class对象,所以你可以滥用这个特性来模拟一个静态变量:
import re
def find_some_pattern(b):
if getattr(find_some_pattern, 'a', None) is None:
find_some_pattern.a = re.compile(r'^[A-Z]+\_(\d{1,2})$')
m = find_some_pattern.a.match(b)
if m is not None:
return m.groups()[0]
return 'NO MATCH'
现在,你可以试试看:
try:
print(find_some_pattern.a)
except AttributeError:
print('No attribute a yet!')
for s in ('AAAA_1', 'aaa_1', 'BBBB_3', 'BB_333'):
print(find_some_pattern(s))
print(find_some_pattern.a)
这是输出:
No attribute a yet!
initialize a!
1
NO MATCH
3
NO MATCH
re.compile('^[A-Z]+\_(\d{1,2})$')
这不是最好的方法(包装器或可调用对象更优雅,我建议您使用其中之一),但我认为这清楚地解释了以下含义:
In Python, functions are first-class objects.