接受函数作为args的异常处理装饰器

时间:2018-12-12 08:41:28

标签: python python-3.x python-decorators

我有一个异常处理装饰器,如下所示:

def error_handler(errors=(Exception, ), default=""):
    def funcator(func):
        def deep_inside(*args, **kwargs):
            try:
                return func(*args, **kwargs)
            except errors as e:
                print("i just cought a", repr(e))
                return default
        return deep_inside
    return funcator

这是一个示例用法:

date_error_handler = error_handler((ValueError), default="INVALID")

from dateutil import parser

@date_error_handler
def date_parser(date):
    return parser.parse(date)

现在,如果我通过这样的事情:

date_parser("12/10/1O")

我将得到这样的输出:

#output: 

i just cought a ValueError('Unknown string format:', '12/1O/10')
'INVALID'

而不是返回"INVALID",我想将一个函数作为参数传递给default(在error_handler装饰器中),该函数将使用日期字符串并尝试替换是否有字母里面有数字。例如,它看起来像这样:

#alphabet to number replacing function(just for example)
def alpha_to_num(date): return date.replace("O", "0")

现在我需要将此alpha_to_num传递为error_handler的{​​{1}}参数的参数。

这是预期输出和使用的示例:

这是一个示例用法:

default

但是现在我想要得到这样的输出:

from dateutil import parser

@error_handler((ValueError), default=alpha_to_num)
def date_parser(date):
    return parser.parse(date)

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您将返回该函数,而不是调用该函数。使用以下代码。

edit:如果未传递函数值或传递的值不是函数,则添加了处理。

def error_handler(errors=(Exception, ), default=""):
    def funcator(func):
        def deep_inside(*args, **kwargs):
            try:
                return func(*args, **kwargs)
            except errors as e:
                print("i just cought a", repr(e))
                return default(*args, **kwargs) if hasattr(default,'__call__') else default
        return deep_inside
    return funcator