一个 Python try/except 函数来统治它们(使用不同的输入)是可能的吗?
A Python try/except function to rule them all (with different inputs) is possibile?
我试图在 Python 中定义一个 try/except 函数,它可以处理各种其他函数。
这个想法是这样的:
def func1(x,y):
z = x+y
return z
def error_check(func1):
try: stuff = func1()
except:
print('Error')
return stuff
error_check(func1('1',2))
在这种情况下,使用这些输入,error_check 函数甚至不起作用。
目的是我可以将 error_check 与另一个具有不同输入数量的 func2 一起使用。例如:
def func2(w,x,y):
z = w+x+y
return z
这可能吗?
非常感谢
您的问题是,在最后一行中,您实际上是在调用 func1
,然后在结果上调用 error_check
。尝试这样的事情,其中 lambda
延迟评估直到 try
块,就像我们想要的那样:
def func1(x,y):
z = x+y
return z
def error_check(func1):
try:
stuff = func1()
return stuff
except:
print('Error')
return None
error_check(lambda: func1('1',2))
你也有一个错误,如果 try
块失败,stuff
是未定义的,所以我冒昧地修复了它。
整个想法的核心问题是捕获错误并不意味着您修复了错误。只需使用引发异常的 func1
尝试您的函数,您就会看到问题所在:
>>> def error_check(func1):
... try:
... stuff = func1()
... except:
... print('Error')
... return stuff
...
>>> def oops():
... raise ValueError
... print("Computing the answer...")
... return 42
...
>>> error_check(oops)
Error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in error_check
UnboundLocalError: local variable 'stuff' referenced before assignment
请注意,我们在输出中没有看到 Computing the answer...
,我们的函数也没有看到 return 42! 我们在 error_check
中无法改变这一点。
问题是,如果 func1
引发异常,它不会 return 任何东西。因此没有stuff
到return。您不能仅仅通过忽略它引发的异常来强制函数“工作”;如果函数引发异常,则意味着 它无法完成它应该做的事情。
也许您对此没有意见,并希望您的 error_check
变为 return None
,而不是 func1
应该 return 的任何东西。如果是这样,你可以这样做:
def error_check(func1):
try:
return func1()
except Exception as e:
print(f"Error")
如果有异常,这将隐含地 return None
。它不会引发另一个异常,但是 func1
仍然不会做它应该做的事情:
>>> error_check(oops)
Error
>>>
请注意,如果我们的程序中的其他东西需要 42
值,那个 东西现在可能会引发错误,如果你发现了error,it 之后的东西会引发错误,依此类推。最终,仅仅捕获错误并忽略它们不会给自己带来任何好处。
综上所述,如果您希望能够将其他参数传递给 func1
,请使用 *args
和 **kwargs
:
def error_check(func1, *args, **kwargs):
try:
return func1(*args, **kwargs)
except Exception as e:
print(f"Error: {e}")
现在你可以做:
error_check(func1, '1', 2)
和 func1
将在 error_check
内调用,其中 *args
为 ('1', 2)
。
我试图在 Python 中定义一个 try/except 函数,它可以处理各种其他函数。 这个想法是这样的:
def func1(x,y):
z = x+y
return z
def error_check(func1):
try: stuff = func1()
except:
print('Error')
return stuff
error_check(func1('1',2))
在这种情况下,使用这些输入,error_check 函数甚至不起作用。 目的是我可以将 error_check 与另一个具有不同输入数量的 func2 一起使用。例如:
def func2(w,x,y):
z = w+x+y
return z
这可能吗?
非常感谢
您的问题是,在最后一行中,您实际上是在调用 func1
,然后在结果上调用 error_check
。尝试这样的事情,其中 lambda
延迟评估直到 try
块,就像我们想要的那样:
def func1(x,y):
z = x+y
return z
def error_check(func1):
try:
stuff = func1()
return stuff
except:
print('Error')
return None
error_check(lambda: func1('1',2))
你也有一个错误,如果 try
块失败,stuff
是未定义的,所以我冒昧地修复了它。
整个想法的核心问题是捕获错误并不意味着您修复了错误。只需使用引发异常的 func1
尝试您的函数,您就会看到问题所在:
>>> def error_check(func1):
... try:
... stuff = func1()
... except:
... print('Error')
... return stuff
...
>>> def oops():
... raise ValueError
... print("Computing the answer...")
... return 42
...
>>> error_check(oops)
Error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in error_check
UnboundLocalError: local variable 'stuff' referenced before assignment
请注意,我们在输出中没有看到 Computing the answer...
,我们的函数也没有看到 return 42! 我们在 error_check
中无法改变这一点。
问题是,如果 func1
引发异常,它不会 return 任何东西。因此没有stuff
到return。您不能仅仅通过忽略它引发的异常来强制函数“工作”;如果函数引发异常,则意味着 它无法完成它应该做的事情。
也许您对此没有意见,并希望您的 error_check
变为 return None
,而不是 func1
应该 return 的任何东西。如果是这样,你可以这样做:
def error_check(func1):
try:
return func1()
except Exception as e:
print(f"Error")
如果有异常,这将隐含地 return None
。它不会引发另一个异常,但是 func1
仍然不会做它应该做的事情:
>>> error_check(oops)
Error
>>>
请注意,如果我们的程序中的其他东西需要 42
值,那个 东西现在可能会引发错误,如果你发现了error,it 之后的东西会引发错误,依此类推。最终,仅仅捕获错误并忽略它们不会给自己带来任何好处。
综上所述,如果您希望能够将其他参数传递给 func1
,请使用 *args
和 **kwargs
:
def error_check(func1, *args, **kwargs):
try:
return func1(*args, **kwargs)
except Exception as e:
print(f"Error: {e}")
现在你可以做:
error_check(func1, '1', 2)
和 func1
将在 error_check
内调用,其中 *args
为 ('1', 2)
。