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

问题描述 投票:0回答:1

在 C/C++ 中,函数可以将局部变量声明为

static
。这样做时,该值保留在内存中,并且可用于对该函数的后续调用(该变量不再是本地变量,但这不是重点)。

有没有办法在Python中做类似的事情,而无需在函数外部声明任何全局变量?

用例:(除其他外)使用正则表达式从输入字符串中提取值的函数。我想预编译模式 (

re.compile()

),而不必在函数作用域之外声明变量。

我可以直接将变量注入到

globals()

:

globals()['my_pattern'] = re.compile(...)
但这看起来不是一个好主意。

python global-variables local-variables
1个回答
3
投票
您可以使用函数属性。在Python中,函数是一等对象,因此您可以滥用此功能来模拟静态变量:

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})$')
这不是最好的方法(包装器或可调用方法更优雅,我建议您使用其中之一),但我认为这清楚地解释了以下含义:

在 Python 中,函数是第一类对象。

© www.soinside.com 2019 - 2024. All rights reserved.