代码之家  ›  专栏  ›  技术社区  ›  noamtm

Python:缓存一个局部函数变量以供后续调用

  •  0
  • noamtm  · 技术社区  · 4 年前

    在C/C++中,函数可以将局部变量声明为 static 执行此操作时,值将保留在内存中,并可用于后续对函数的调用(此变量不再是局部变量,但这与点无关)。

    在Python中有没有类似的方法, 没有 必须声明函数外的任何全局变量?

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

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

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

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

    0 回复  |  直到 4 年前
        1
  •  2
  •   PieCot    4 年前

    您可以使用函数属性。在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中,函数是一级对象。