2010-12-27 4 views
0

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

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

вот мой код:

class relist(list): 
def __init__(self, l): 
    list.__init__(self, l) 

def __getitem__(self, rexp): 
    r = re.compile(rexp) 
    res = filter(r.match, self) 
    return res 

if __name__ == '__main__': 
    import re 
    listl = [x+y for x in 'test string' for y in 'another string for testing'] 
    print(listl) 
    test = relist(listl) 
    print('----------------------------------') 
    print(test['[s.]']) 

Когда я запускаю этот код из командной строки она работает так, как я ожидаю, что это; Однако, когда я запускаю его через питон интерактивного режим, я получаю ошибку

>>> test['[s.]'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "relist.py", line 8, in __getitem__ 
    r = re.compile(rexp) 
NameError: global name 're' is not defined 

В то время как в интерактивном режиме я импорт повторно, и я могу использовать функции повторно, но по какой-то причине, когда я пытаюсь выполнить модуль не работает.

Нужно ли мне импортировать повторно в область действия класса? Я бы не подумал, потому что не ищет python через другие области, если он не найден в текущем?

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

ответ

1

Python ничего не работает «раньше времени»; он запускает код, когда он встречает его. Единственное, что сделано «раньше времени», это перевести исходный код в байт-код.

При импорте модуля __name__ - это имя модуля, а не __main__. Таким образом, код в блоке if в конце не выполняется, а re не импортируется. Когда вы затем пытаетесь использовать класс, имя re просматривается прямо тогда, когда это необходимо (для доступа re.compile) и не найдено (поскольку модуль ранее не был импортирован).

2

Перемещение «импорта повторно» из нижней «если ...» в верхней части файла:

import re 

class .... 

Вы только импортировать модуль заново при запуске в программе, а не импортируется как модуль.

(Кроме того, стиль Python предпочитает имена классов в верхнем регистре.)

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