декоратор обработки исключений, который принимает функции как аргументы - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть декоратор обработки исключений, который выглядит следующим образом:

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 'default param.

вот пример ожидаемого вывода и использования:

вот пример использования:

from dateutil import parser

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

но теперь я хочу получить вывод, подобный этому:

#expected output: 

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

как мне сделать что-то подобное?

1 Ответ

0 голосов
/ 12 декабря 2018

Вы возвращаете функцию вместо вызова этой функции.используйте код ниже.

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
...