只能在定义后使用一次包装函数然后得到 NameError
Can only use wrapper function a single time after definition then getting NameError
背景
我正在使用 pdfquery to scrap data from pdfs. Like this one. This questions builds off my earlier question 。
我已经成功地使用了可以接受参数的自定义包装函数 。除了以下问题,当我在 jupyter notebook 中多次尝试 运行 它时给我带来了麻烦;
单元格 1
import pdfquery
def load_file(PDF_FILE):
pdf = pdfquery.PDFQuery(PDF_FILE)
pdf.load()
return pdf
file_with_table = 'path_to_the_file_mentioned_above.pdf'
pdf = load_file(file_with_table)
单元格 2
def in_range(prop, bounds):
def wrapped(*args, **kwargs):
n = float(this.get(prop, 0))
return bounds[0] <= n <= bounds[1]
return wrapped
def is_element(element_type):
def wrapped(*args, **kwargs):
return this.tag in element_type
return wrapped
def str_len(condition):
def wrapped(*args, **kwargs):
cond = ''.join([str(len(this.text)),condition])
return eval(cond)
return wrapped
单元格 3
x_check = in_range('x0', (97, 160))
y_check = in_range('y0', (250, 450))
el_check = is_element(['LTTextLineHorizontal', 'LTTextBoxHorizontal'])
str_len = str_len('>0')
els = pdf.pq('LTPage[page_index="0"] *').filter(el_check)
els = els.filter(str_len)
els = els.filter(x_check)
els = els.filter(y_check)
[(i.text) for i in els]
函数 str_len
如果在定义后 运行 一次就可以正常工作;
运行在图中显示第三个单元格时没有错误
但是当我第二次尝试 运行 函数时抛出 NameError
;
NameError
在 运行 第二次进入第三个单元格之后。
这是NameError
的正文
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-27-54cd329bb1e1> in <module>()
2 y_check = in_range('y0', (250, 450))
3 el_check = is_element(['LTTextLineHorizontal', 'LTTextBoxHorizontal'])
----> 4 str_len = str_len('>0')
5
6 els = pdf.pq('LTPage[page_index="0"] *').filter(el_check)
<ipython-input-25-654bff7d0eed> in wrapped(*args, **kwargs)
12 def str_len(condition):
13 def wrapped(*args, **kwargs):
---> 14 return eval(''.join([str(len(this.text)),condition]))
15 return wrapped
NameError: name 'this' is not defined
问题
为什么这个函数定义后只能使用一次?
有没有办法绕过这个问题?
函数名称和其他变量一样是变量;函数没有单独的命名空间。 str_len = str_len('>0')
将名称 str_len
重新绑定到调用的 return 值 str_len
的原始值。在这一行之后,您不再有对该函数的引用。为计算的长度使用不同的名称:
new_name = str_len('>0')
背景
我正在使用 pdfquery to scrap data from pdfs. Like this one. This questions builds off my earlier question
我已经成功地使用了可以接受参数的自定义包装函数
单元格 1
import pdfquery
def load_file(PDF_FILE):
pdf = pdfquery.PDFQuery(PDF_FILE)
pdf.load()
return pdf
file_with_table = 'path_to_the_file_mentioned_above.pdf'
pdf = load_file(file_with_table)
单元格 2
def in_range(prop, bounds):
def wrapped(*args, **kwargs):
n = float(this.get(prop, 0))
return bounds[0] <= n <= bounds[1]
return wrapped
def is_element(element_type):
def wrapped(*args, **kwargs):
return this.tag in element_type
return wrapped
def str_len(condition):
def wrapped(*args, **kwargs):
cond = ''.join([str(len(this.text)),condition])
return eval(cond)
return wrapped
单元格 3
x_check = in_range('x0', (97, 160))
y_check = in_range('y0', (250, 450))
el_check = is_element(['LTTextLineHorizontal', 'LTTextBoxHorizontal'])
str_len = str_len('>0')
els = pdf.pq('LTPage[page_index="0"] *').filter(el_check)
els = els.filter(str_len)
els = els.filter(x_check)
els = els.filter(y_check)
[(i.text) for i in els]
函数 str_len
如果在定义后 运行 一次就可以正常工作;
运行在图中显示第三个单元格时没有错误
但是当我第二次尝试 运行 函数时抛出 NameError
;
NameError
在 运行 第二次进入第三个单元格之后。
这是NameError
的正文
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-27-54cd329bb1e1> in <module>()
2 y_check = in_range('y0', (250, 450))
3 el_check = is_element(['LTTextLineHorizontal', 'LTTextBoxHorizontal'])
----> 4 str_len = str_len('>0')
5
6 els = pdf.pq('LTPage[page_index="0"] *').filter(el_check)
<ipython-input-25-654bff7d0eed> in wrapped(*args, **kwargs)
12 def str_len(condition):
13 def wrapped(*args, **kwargs):
---> 14 return eval(''.join([str(len(this.text)),condition]))
15 return wrapped
NameError: name 'this' is not defined
问题
为什么这个函数定义后只能使用一次?
有没有办法绕过这个问题?
函数名称和其他变量一样是变量;函数没有单独的命名空间。 str_len = str_len('>0')
将名称 str_len
重新绑定到调用的 return 值 str_len
的原始值。在这一行之后,您不再有对该函数的引用。为计算的长度使用不同的名称:
new_name = str_len('>0')