python交互模式模块导入问题

时间:2010-12-27 17:49:07

标签: python namespaces scope

我相信我有一个所谓的范围问题,也许是名称空间。不太确定我是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 个答案:

答案 0 :(得分:2)

将“import re”从底部“if ...”移到文件顶部:

import re

class ....

您只是在作为程序运行时导入re模块,而不是作为模块导入。

(另外,Python风格更喜欢大写的类名。)

答案 1 :(得分:1)

Python没有“提前”运行任何东西;它在遇到代码时运行代码。 “提前”完成的唯一事情就是将源代码翻译成字节码。

导入模块时,__name__是模块的名称,而不是__main__。因此,不执行末尾if块中的代码,并且不导入re。然后,当您尝试使用该类时,会立即查找名称re,何时需要(访问re.compile),而未找到(因为模块未在之前导入)。 / p>