Можно использовать функцию-оболочку только один раз после определения, а затем получить NameError

Фон

Я использую pdfquery для удаления данных из PDF-файлов. Нравится этот. Этот вопрос основан на моем предыдущем вопросе здесь .

Мне удалось успешно использовать пользовательские функции-оболочки, которые могут принимать аргументы, как показано в этом ответе. За исключением следующего, что доставляет мне проблемы, когда я пытаюсь запустить его несколько раз в блокноте jupyter;

Ячейка 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 

Вопросы

Почему я могу использовать эту функцию только один раз после ее определения?

Можно ли как-то обойти эту проблему?


person James Draper    schedule 29.08.2017    source источник
comment
Вам действительно нужно то же имя здесь, не можете ли вы назвать левую сторону по-другому и использовать ее позже с этим новым именем? str_len = str_len('›0')   -  person CrazyElf    schedule 29.08.2017


Ответы (1)


Имена функций — это такие же переменные, как и любые другие; нет отдельного пространства имен для функций. str_len = str_len('>0') повторно привязывает имя str_len к возвращаемому значению вызова к исходному значению str_len. После этой строки у вас больше нет ссылки на функцию. Используйте другое имя для вычисленной длины:

new_name = str_len('>0')
person chepner    schedule 29.08.2017