首页 > 解决方案 > 如何最好地从代码块中删除冗余调用,应该在块成功存在时执行?

问题描述

我正在尝试简化以下代码(删除多余的打印),但找不到令人满意的方法:

原始代码

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,这也使代码更简洁/干净;显然还有很多更糟糕的方法)。

标签: pythonpython-3.xrefactoring

解决方案


如果你一直想做的事情是关闭一个文件,我会使用一个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")

参考:


推荐阅读