我正在编译一个正则表达式模式以多次使用它。
但是,我想在函数中使用它,所以现在我将它用作全局变量。但是,我不需要在这个特定的函数之外,所以我想知道我是否可以将它作为静态变量编写,这意味着它将被编译一次并且对于所有函数实例/出现。
import re
p = re.compile(“[0-9|-]+”)
def search(txt):
global p
# some stuff
return p.search(txt).group(0)
PS当然,在这个具体的例子中,它不会为我节省足够的内存,我只是想知道我是否可以这样做。另外,我认为这会让我更具可读性。
答案 0 :(得分:2)
在C中,一个"静态变量"只是一个全局变量,只能在一个函数中看到。*术语"静态"在其他语言中有其他含义,但这显然是OP的意思。
Python没有这种变体的静态变量。如果您只想在一个函数中使用全局变量,那么只在一个函数中使用它。 Globals除了内置函数之外从不影响任何东西,所以如果你选择一个合理的变量名称(全局常量的PEP 8 recommends ALL_CAPS
),这不应该是困难的。 Globals也被它们的模块封装,因此命名空间污染也不应该是一个太大的问题。
在设计方面,使用常量全局变量没有任何错误。编译一次但从未改变的模式与任何其他全局常量没有区别。
*从技术上讲,它通常以相反的方式定义(全局变量是一个全局可见的静态变量),但我为了方便起见这样做。
答案 1 :(得分:0)
您可以将它全部放在一个对象中,然后编译的正则表达式将是一个实例变量:
import re
class Searcher:
def __init__(self):
self.p = re.compile("[0-9|-]+")
def search(self, text):
return self.p.search(text).group(0)
s = Searcher()
# Use it as much as you want now
print s.search("123-345")
print s.search("123-abc")