我发现自己一遍又一遍地拥有这种模式:
variable = ""
try:
variable = ... do some file loading stuff ...
except:
variable = ""
Run Code Online (Sandbox Code Playgroud)
有没有办法将它压缩成一个表达式?与if-else语句一样,您可以转向:
variable = ""
if something:
variable = somethingelse
else:
variable = ""
Run Code Online (Sandbox Code Playgroud)
成
variable = somethingelse if something else ""
Run Code Online (Sandbox Code Playgroud)
try-catch有没有相同的东西?
kin*_*all 19
由于agf已经提供了我推荐的方法,这里是他的例程的一个版本,有一些小的改进:
def try_except(success, failure, *exceptions):
try:
return success()
except exceptions or Exception:
return failure() if callable(failure) else failure
Run Code Online (Sandbox Code Playgroud)
这个版本:
允许您准确指定将作为附加可选参数捕获的异常.您应始终捕获将执行此任务的最小异常集,并让您无法处理的异常冒泡到调用方.
支持使用普通值以及故障值的函数.这可以节省您在很多情况下使用lambda的麻烦.(当然,而不是lambda: ''你可以使用str.)
agf*_*agf 15
def try_except(success, failure):
try:
return success()
except:
return failure()
variable = try_except(do_some_file_loading_stuff, lambda: '')
Run Code Online (Sandbox Code Playgroud)
我认为代码是自我解释的.它返回返回的值success,除非有错误,则返回返回的值failure.如果do_some_file_loading_stuff是表达式而不仅仅是函数调用,也将它包装在一个表达式中lambda.
编辑: @kindall和我改进了他的版本,所以它和我的一样快,如果你想要的话可以被称为完全相同,有更多的功能,并且是相同的行数.用它!
def try_except(success, failure, *exceptions):
try:
return success()
except exceptions or Exception:
return failure() if callable(failure) else failure
Run Code Online (Sandbox Code Playgroud)
kin*_*all 13
这是一个提供一点快捷方式的上下文管理器:
from contextlib import contextmanager
@contextmanager
def catch(*exceptions, **kwargs):
try:
yield kwargs.get("default", None)
except exceptions or Exception:
pass
Run Code Online (Sandbox Code Playgroud)
用法:
with catch(ZeroDivisionError, default=0) as x:
x = 3 / 0 # error
print x # prints 0, the default
Run Code Online (Sandbox Code Playgroud)
这里的基本思想是上下文管理器返回您传递的任何默认值,然后将其分配给您在with语句as子句中指定的变量.然后,在上下文中,执行一个尝试分配给同一个变量的语句.如果它引发异常,则上下文管理器捕获并静默忽略它,但由于分配没有发生,因此保留默认值.
可能对多行计算特别有用,但仍会产生单个值.
| 归档时间: |
|
| 查看次数: |
14211 次 |
| 最近记录: |