我相信我有一个所谓的范围问题,也许是名称空间。不太确定我是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,那么它是否会搜索其他范围?
感谢您的帮助,如果有更好的方式进行此搜索,我将有兴趣了解。感谢
答案 0 :(得分:2)
将“import re”从底部“if ...”移到文件顶部:
import re
class ....
您只是在作为程序运行时导入re模块,而不是作为模块导入。
(另外,Python风格更喜欢大写的类名。)
答案 1 :(得分:1)
Python没有“提前”运行任何东西;它在遇到代码时运行代码。 “提前”完成的唯一事情就是将源代码翻译成字节码。
导入模块时,__name__
是模块的名称,而不是__main__
。因此,不执行末尾if
块中的代码,并且不导入re
。然后,当您尝试使用该类时,会立即查找名称re
,何时需要(访问re.compile
),而未找到(因为模块未在之前导入)。 / p>