Python中不可思议的“除外”加注

时间:2015-03-25 06:46:46

标签: python python-2.7 wrapper

请帮助python脚本。 Python 2.7。 我尝试使用错误检查重复操作的一些功能。 所以在我认为的函数中我调用下面(lib_func),没有错误。 但是"除了"在repeater()提升任何方式。

如果我不使用" x"在lib_func()中 - 它没有错误,但我仍然需要在lib_func()中放置参数。

抱歉英语不好,并提前感谢您的帮助。

def error_handler():
    print ('error!!!!!!')

def lib_func(x):
    print ('lib_func here! and x = ' + str(x))

def repeater(some_function):
    for attempts in range(0, 2):
        try:
            some_function()
        except:
            if attempts == 1:
                error_handler()
            else:
                continue
    break
return some_function

repeater(lib_func(10))

输出:

lib_func here! and x = 10
error!!!!!!

Process finished with exit code 0

3 个答案:

答案 0 :(得分:6)

您的缩进错误,应按如下方式调用转发器:

def repeater(some_function):
    for attempts in range(0, 2):
        try:
            some_function()
        except:
            if attempts == 1:
                error_handler()
            else:
                continue
    return some_function()

repeater(lambda: lib_func(10)) # pass `lib_func(10)` using lambda

我不明白你想要达到的目标,但上面的代码在for循环中执行lib_func(10)几次。

或者,您可以使用partial:

from functools import partial    
lf = partial(lib_func, 10)    
repeater(lf)

答案 1 :(得分:2)

你应该传递函数指针而不是像你在这里那样调用它

repeater(lib_func(10))

应该是

repeater(lib_func)

您可以修改它以将数字作为参数

repeater(lib_func, 10)

你的功能应该是

def repeater(some_function, some_value):
    for attempts in range(0, 2):
        try:
            some_function(some_value)
        except:
            if attempts == 1:
                error_handler()
            else:
                continue
        #the break statement makes no sense 
    return #why would you return the function as it is not doing anything!

答案 2 :(得分:2)

你有变量与功能的问题。

期望使用函数作为参数调用

repeater。因此,当您致电repeater(lib_func)时,一切正常:some_function()实际上会调用lib_func()

但是当你尝试调用repeater(lib_func(10))时,python首先计算lib_func(10))(在上面的代码中返回None),然后调用repeater(None) =>因为None不可调用而给出异常!

如果您希望能够使用带有一个参数的函数调用转发器,则应将参数传递给repeater。例如:

def repeater(some_function, arg = None):
    for attempts in range(0, 2):
        try:
            cr = some_function() if arg is None else some_function(arg)
        except:
            if attempts == 1:
                error_handler()
            else:
                continue
        break
    return cr

repeater(lib_func, 10)

或者如果你想接受可变数量的参数:

def repeater(some_function, *args):
    for attempts in range(0, 2):
        try:
            cr = some_function(*args)
        except:
            if attempts == 1:
                error_handler()
            else:
                continue
        break
    return cr

repeater(lib_func, 10)