Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 接受函数作为参数的异常处理装饰器_Python_Python 3.x_Python Decorators - Fatal编程技术网

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
作为默认值,而不是返回包含传递给函数的参数的列表。