带参数的装饰器:为什么它总是返回False?

时间:2019-06-24 07:07:17

标签: python decorator python-tesseract lackey

为什么以下函数返回False?

我正在将pytesseract用于lackey的字符识别(OCR)。如果OCR失败,则应根据某些条件(例如字符串太短),使用不同的参数(用于图像处理)重试。由于我需要将此机制应用于不同的功能,因此我使用了带参数的装饰器。

我写了一个简化的版本,其中['a', 'b', 'c', 'd']代表c的图像处理参数列表。如果全部失败,则会引发异常。

from functools import wraps
def try_another_way(my_list):
    def outer(callback):
        @wraps(callback)
        def closure(i=0, *args, **kwargs):
            try:
                foo = callback(my_list[i],  *args, **kwargs)
                if not foo:
                    closure(i+1, *args, **kwargs)
                return foo
            except IndexError:
                raise Exception("Character recognition failed")
        return closure
    return outer

# Simplified function
@try_another_way(
    ['a', 'b', 'c', 'd'])
def my_func(my_item=None):
    print("func {}".format(my_item))
    return True if my_item == 'c' else False

x = my_func()

# Function closer to real scenario
@try_another_way(
    [config0, config1, config2])
def read_time_from_image(my_item=None):
    my_img = some_image_processing(config=my_item)
    my_str = pytesseract.image_to_string(my_img)
    if len(my_str) < 7:
        return False
    return my_str

我还尝试使用断点来调试它,先是i is 2,然后是foo is True,但是它两次进入第10行,并再次进入foo is False,最后返回False。为什么会这样?

0 个答案:

没有答案