【问题标题】:Make the statements (if, try) shorter使语句(如果,尝试)更短
【发布时间】:2018-07-11 19:06:15
【问题描述】:

我在脚本开头有以下代码块:

try:
    sys.argv[3]
except Exception:
    print(use)
    sys.exit()

if int(sys.argv[2]) > 4:
    print 'works'
    sys.exit()
else:
    print(use)
    sys.exit()

我进行了检查,但正如您所见,它看起来并不漂亮,因为重复了“print(use); sys.exit()”部分。有什么方法可以让它更短更漂亮?

【问题讨论】:

  • 这不是关于性能的问题。
  • 使用argparse...?
  • int(sys.argv[2]) 如果值不是您没有保护的整数,则可能会崩溃。
  • 你不能真正分解:第一个 sys.exit() 应该是 raise (即重新引发异常)。第二个可以是 sys.exit()。第三个应该是raise ValueError("args[2] must be >4")

标签: python refactoring command-line-arguments


【解决方案1】:

您可以使用argparse免费获得所有这些功能:

from argparse import ArgumentParser, ArgumentTypeError

def greater_than_4(string):
    value = int(string)
    if value <= 4:
        raise ArgumentTypeError('%r must be greater than 4' % string)
    return value

parser = ArgumentParser()
parser.add_argument('first', type=greater_than_4)
parser.add_argument('second')
args = parser.parse_args()

print 'works'

【讨论】:

    【解决方案2】:

    也许是这个?

    try:
        sys.argv[3]
        if int(sys.argv[2]) > 4:
            print 'works'
        else
            raise ValueException("Incorrect parameter passed")
    except Exception:
        print(use)
    finally:
        sys.exit()
    

    【讨论】:

      【解决方案3】:

      我会为此创建一个函数:

      def report_and_quit(message=''):
          print(message)
          sys.exit()
      

      然后你可以这样做:

      try:
          sys.argv[3]
      except Exception:
          report_and_quit(use)
      
      if int(sys.argv[2]) > 4:
          report_and_quit('works')
      else:
          report_and_quit(use)
      

      【讨论】:

        【解决方案4】:
        try:
            x = int(sys.argv[2])
            assert x > 4
            y = sys.argv[3]
        except Exception:
            print(use)
            sys.exit()
        
        print('works')
        

        【讨论】:

          【解决方案5】:

          这个怎么样?

          def tmp(use):
              print(use)
              sys.exit()
          
          try:
              sys.argv[3]
          except Exception:
              tmp(use)
          
          if int(sys.argv[2]) > 4:
              print 'works'
              sys.exit()
          else:
              tmp(use)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-28
            • 2016-03-26
            • 1970-01-01
            • 2012-02-25
            • 1970-01-01
            相关资源
            最近更新 更多