python - 如何最好地从代码块中删除冗余调用,应该在块成功存在时执行?
问题描述
我正在尝试简化以下代码(删除多余的打印),但找不到令人满意的方法:
原始代码
def main():
if expression1:
print("1")
print("always_do_this")
return
if expression2:
print("2")
print("always_do_this")
return
# ... possibly more expressions and thus redundancy
print("always_do_this")
# do something else
我的第一个想法是try-(except-)else
组合,但在-blockelse
的返回时不执行。try
解决方案 1 - 提取到单独的函数中
def func():
if expression1:
print("1")
return True
if expression2:
print("2")
return True
return False
def main():
result = func()
print("always_do_this")
if result:
return
# do something else
解决方案 2 - 使用 finally 的解决方法
def main():
error = False
try:
if expression1:
print("1")
return
if expression2:
print("2")
return
except:
error = True
raise
finally:
if not error:
print("always_do_this")
# do something else
在python中肯定有更好的方法来实现这一点吗?
PS:也将不胜感激任何关于更好标题的想法...
PPS:我不是直接询问(主观)代码样式,而是想知道是否有一种我没有考虑过的方法来编写这个(例如语言结构/pattern,这也使代码更简洁/干净;显然还有很多更糟糕的方法)。
解决方案
如果你一直想做的事情是关闭一个文件,我会使用一个with
语句。在更一般的情况下,您可以创建自己的上下文管理器来完全控制最终运行的内容。
示例代码:
class my_closer:
def __enter__(self):
return True
def __exit__(self, type, value, traceback):
if type is None:
print("always_do_this")
else
print("An exception was raised: {}".format(type))
def main():
with my_closer() as c:
if someexpr:
print("1")
return
if someexpr:
print("2")
return
我添加了一个多余else
的内容来打印有关异常的内容以防出错,但将其保留以更准确地重现您的原始代码。
这段代码并不比你的代码短print
,但我喜欢这种方法用于更复杂的“更接近”的代码。
您还可以使用contextlib
库以这种方式定义上下文管理器:
from contextlib import contextmanager
@contextmanager
def my_closer(*args, **kwds):
try:
yield True
except:
#print("some error happened")
raise
else:
print("always_do_this")
参考:
推荐阅读
- sapui5 - SAPUI5 格式化程序参数值始终为空
- vue.js - Vue 在创建新组件时丢失原型和导入的文件
- excel - access和excel中带有标签计数项目的列表框
- typescript - IE 11 或更低版本中的 Vue 应用程序空白页,即使使用 polyfill
- android - 如何编辑许可声明表?
- javascript - Javascript将数据放在列表中
- javascript - 限制 ng-repeat 但搜索整个数组
- java - 基于 Java 中的 Silence 拆分 wav 文件
- sql - 如何使用 CURSOR/PROC 计算 SQL 中 2 个不同天之间的工作时间?
- eclipse - Eclipse 如何使用命令创建新的运行配置