Python 接受函数作为参数的异常处理装饰器
我有一个异常处理装饰器,如下所示:Python 接受函数作为参数的异常处理装饰器,python,python-3.x,python-decorators,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: pri
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_parser("12/10/1O")
#output:
i just cought a ValueError('Unknown string format:', '12/1O/10')
'INVALID'
#alphabet to number replacing function(just for example)
def alpha_to_num(date): return date.replace("O", "0")
#expected output:
i just cought a ValueError('Unknown string format:', '12/1O/10')
'12/10/10'
下面是一个示例用法:
date_error_handler = error_handler((ValueError), default="INVALID")
from dateutil import parser
@date_error_handler
def date_parser(date):
return parser.parse(date)
from dateutil import parser
@error_handler((ValueError), default=alpha_to_num)
def date_parser(date):
return parser.parse(date)
现在,如果我通过这样的考试:
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_parser("12/10/1O")
#output:
i just cought a ValueError('Unknown string format:', '12/1O/10')
'INVALID'
#alphabet to number replacing function(just for example)
def alpha_to_num(date): return date.replace("O", "0")
#expected output:
i just cought a ValueError('Unknown string format:', '12/1O/10')
'12/10/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
date_parser("12/10/1O")
#output:
i just cought a ValueError('Unknown string format:', '12/1O/10')
'INVALID'
#alphabet to number replacing function(just for example)
def alpha_to_num(date): return date.replace("O", "0")
#expected output:
i just cought a ValueError('Unknown string format:', '12/1O/10')
'12/10/10'
我不想返回“INVALID”
而是想将一个函数作为参数传递给default
(在错误处理程序
装饰器中),它将获取日期字符串,并尝试替换其中是否有字母和数字。例如,它看起来是这样的:
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_parser("12/10/1O")
#output:
i just cought a ValueError('Unknown string format:', '12/1O/10')
'INVALID'
#alphabet to number replacing function(just for example)
def alpha_to_num(date): return date.replace("O", "0")
#expected output:
i just cought a ValueError('Unknown string format:', '12/1O/10')
'12/10/10'
现在我需要将这个alpha_传递给\u num
作为错误处理程序的默认值参数
以下是预期输出和使用的示例:
下面是一个示例用法:
date_error_handler = error_handler((ValueError), default="INVALID")
from dateutil import parser
@date_error_handler
def date_parser(date):
return parser.parse(date)
from dateutil import parser
@error_handler((ValueError), default=alpha_to_num)
def date_parser(date):
return parser.parse(date)
但现在我想得到如下输出:
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_parser("12/10/1O")
#output:
i just cought a ValueError('Unknown string format:', '12/1O/10')
'INVALID'
#alphabet to number replacing function(just for example)
def alpha_to_num(date): return date.replace("O", "0")
#expected output:
i just cought a ValueError('Unknown string format:', '12/1O/10')
'12/10/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
那么预期产量是多少?基本上是固定产量。(上面最后一个代码块)澄清一下:您希望default
始终是一个函数吗?或者您想同时支持“普通值”和函数默认值吗?如果您总是希望default
成为函数,只需使用returndefault(*args,**kwargs)
更改returndefault
。要支持这两种类型的值,这取决于您希望如何处理某些对冲案例。。。我个人会使用两个不同的参数,这样在创建装饰器时就可以清楚地知道是哪种情况。这还允许函数类型具有固定的默认值,这在两种情况下使用一个参数很难处理。修饰函数的参数可以作为*args
参数中的元组访问。与返回默认值不同,只需返回args[0]
如果他没有将任何内容分配给默认值会发生什么?如果默认值为空字符串,为什么不返回?当默认值未传递或默认值不是函数时,要处理的已编辑答案。这对于类失败:错误处理程序(默认值=列表)
。在这种情况下,它将返回list
作为默认值,而不是返回包含传递给函数的参数的列表。