python - 类初始化时导入的模块不能被方法使用
问题描述
我创建了一个类,它在启动时导入一些模块,然后这些模块在一些类方法中使用。当我在方法中调用模块时,我得到一个 NameError ,这些模型没有定义
class Paper(object):
'''
analyse a paper and extract parts of it
'''
def __init__(self, paper_path):
#import needed modules
needed_modules = ['io', 'pdfminer', 'pickle', 're', 'string', 'os']
import io, pickle, re, string, os
from pdfminer.converter import TextConverter as TC
from pdfminer.pdfinterp import PDFPageInterpreter as PInt
from pdfminer.pdfinterp import PDFResourceManager as RM
from pdfminer.pdfpage import PDFPage as Page
from pdfminer.layout import LAParams as LAP
self._pPath = paper_path
def get_text(self):
res_manager = RM()
fake_file_handle = io.StringIO()
codec = 'utf-8'
laparams = LAP()
converter = TextConverter(res_manager,
fake_file_handle,codec=codec, laparams=laparams)
page_interpreter = PInt(res_manager, converter)
with open(self._pPath, 'rb') as fh:
for page in Page.get_pages(fh,
caching=True,
check_extractable=True):
page_interpreter.process_page(page)
text = fake_file_handle.getvalue()
# close open handles
converter.close()
fake_file_handle.close()
if text:
return text
运行此代码时:
pPath = 'path'
item = Paper(pPath)
print(len(item.get_text()))
我收到以下错误
NameError: name 'RM' is not defined
解决方案
正如 Harm 所说:导入对于您的__init__
方法来说是本地的。您需要将它们向上移动或将它们存储到某个变量中,然后locals()
在每个方法中更新。
一个非常丑陋的黑客:
def __init__(self, paper_path):
...
self.imports = locals() # possibly only include the imports, not the entire dict
def get_text(self):
locals().update(self.locals)