2015-09-18 2 views
0

Я компилирую шаблон регулярного выражения, чтобы использовать его несколько раз.Python: «переменные метода» для независимой функции

Однако я хочу использовать его внутри функции, поэтому теперь я использую ее как глобальную переменную. Тем не менее, я не нуждаюсь в нем вне этой конкретной функции, поэтому я задаюсь вопросом, могу ли я записать его как статическую переменную, то есть он будет скомпилирован один раз и для всех экземпляров/вхождений функций.

import re 
p = re.compile(“[0-9|-]+”) 

def search(txt): 
    global p 

    # some stuff 
    return p.search(txt).group(0) 

PS Конечно, в этом конкретном примере, это не спасет меня никакого достаточного количества памяти, я просто хочу, чтобы найти, если я могу сделать это в целом. Кроме того, было бы мне более удобным для чтения таким образом, я думаю,

+0

'def search (текст, рисунок)' не работает? – IanAuld

ответ

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") 
+0

Для этой цели класс, вероятно, переполнен, когда шаблон можно легко передать в качестве параметра. – IanAuld

+1

Это правда. Но так как его пример не работает ('txt' vs' text'), я предположил, что это макетный пример, который является частью более крупной программы. – Tyler

2

В Си «статическая переменная» - это просто глобальная переменная, которая видна только внутри одной функции. * Термин «статический» имеет другие значения на других языках, но это, очевидно, означает один OP.

Python не имеет статических переменных этого разнообразия. Если вы хотите, чтобы ваша глобальная переменная использовалась в одной функции, вы используете ее только в одной функции. Глобалы никогда не трясут ничего, кроме встроенных, поэтому это не должно быть сложно, если вы выберете разумное имя переменной (PEP 8 recommends ALL_CAPS для глобальных констант). Глобалы также инкапсулированы их модулем, поэтому загрязнение пространства имен также не должно быть слишком большой проблемой.

Нет ничего неправильного, конструктивного, с постоянными глобальными переменными. Шаблон, который компилируется один раз и никогда не изменяется, ничем не отличается от любой другой глобальной константы.

* Технически, это обычно определяется наоборот (глобальная переменная является глобальной видимой статической переменной), но я формулирую ее таким образом для удобства.

Смежные вопросы