Проблема импорта модуля интерактивного режима python - PullRequest
0 голосов
/ 27 декабря 2010

Я полагаю, что у меня есть то, что называется проблемой объема, возможно, пространством имен.Не слишком уверен, что я новичок в 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.]'])

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

>>> 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

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

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

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

Ответы [ 2 ]

2 голосов
/ 27 декабря 2010

Переместите «import re» из нижней части «if ...» в верхнюю часть файла:

import re

class ....

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

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

1 голос
/ 27 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...