如何最好地从代码块中删除冗余调用,当代码块成功存在时应该执行这些调用?

2024-03-28 23:43:24 发布

您现在位置: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组合,但是else不会在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中肯定有更好的方法来实现这一点吗?你知道吗

附言:如果您有任何关于更好标题的想法,我们将不胜感激……
PPS:我不是直接问(主观的)代码风格,而是想知道是否有一种我没有考虑的方法来编写这个代码(例如,一种语言结构/模式,它也使代码更简洁/更清晰;显然还有很多更糟糕的方法)。你知道吗


Tags: 方法代码returnifmaindefthisalways
2条回答

如果您总是想关闭一个文件,我会使用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语句的代码短,但是对于更复杂的“closer”代码,我喜欢这种方法。你知道吗

也可以使用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")

参考文献:

检查流是否没有进入前两个if块,方法是检查前两个if语句的对立面是否由and连接,这样,只有前两个if语句失败时,才能执行“do something other”。在if语句的末尾而不是中间返回。你知道吗

def main():
    expression1 = True
    expression2 = False

    if expression1:
        print("1")
    elif expression2:
        print("2")

    print("always_do_this")

    if not expression1 and not expression2:
        # do something else

    return

相关问题 更多 >