只能在定义后使用一次包装函数然后得到 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')