关于python:异常处理装饰器,它接受args作为函数

exception handling decorator which accepts functions as args

我有一个异常处理装饰器,看起来像这样:

1
2
3
4
5
6
7
8
9
10
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

这是一个示例用法:

1
2
3
4
5
6
7
date_error_handler = error_handler((ValueError), default="INVALID")

from dateutil import parser

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

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

1
date_parser("12/10/1O")

我会得到这样的输出:

1
2
3
4
#output:

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

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

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

现在我需要将此alpha_to_num作为参数传递给error_handlerdefault参数。

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

这是一个示例用法:

1
2
3
4
5
from dateutil import parser

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

但现在我想获得这样的输出:

1
2
3
4
#expected output:

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

我该怎么办?


您正在返回该函数而不是调用该函数。 使用下面的代码。

编辑:如果未传递或传递函数值,则添加处理值不是函数。

1
2
3
4
5
6
7
8
9
10
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