【问题标题】:Restrict combination of command line arguments限制命令行参数的组合
【发布时间】:2019-10-29 01:00:12
【问题描述】:

我写了一个 python 程序,它接受三个可选的命令行参数。但是我想限制用户输入的 args 组合。它们是:

python script.py -all
python script.py --country_name
python script.py --country_name --city_name

我不应该执行任何其他组合程序。

注意:我使用的是 argparse python 模块

【问题讨论】:

    标签: python python-3.x argparse


    【解决方案1】:

    如果我能看到你的代码可能会更容易......但基本上,一旦你运行:

    args = parser.parse_args()
    

    然后您可以将自己的验证放入其中。例如。

    if args.all and (args.country_name or args.city_name):
        raise MySuitableError
    

    【讨论】:

      【解决方案2】:

      Argparse 有一个mutually exclusive group:

      import argparse
      
      def main(parser, args):
          if args.country_city is not None:
              country, city = args.country_city
          print(args)
      
      if __name__ == "__main__":
          parser = argparse.ArgumentParser(description="Hello")
          group = parser.add_mutually_exclusive_group()
          group.add_argument("-all")
          group.add_argument("--country_city", nargs="+")
          main(parser, parser.parse_args())
      
      

      结果:

      python3 test.py -all A --country_city a b
      usage: test.py [-h]
                         [-all ALL | --country_city COUNTRY_CITY [COUNTRY_CITY ...]]
      test.py: error: argument --country_city: not allowed with argument -all
      
      python3 test.py --country_city a b
      Namespace(all=None, country_city=['a', 'b'])
      
      python3 test.py -all A
      Namespace(all='A', country_city=None)
      

      【讨论】:

        【解决方案3】:

        我根本不会使用选项,而是可以省略的位置参数。

        p = ArgumentParser()
        p.add_argument('country', nargs='?')
        p.add_argument('city', nargs='?')
        

        然后

        script.py           # equiv to old script.py --all
        script.py FI        # equiv to old script.py --countryname FI
        script.py FI Turku  # equivalent to old script.py --countryname FI --cityname Turku
        

        【讨论】:

          猜你喜欢
          • 2012-02-25
          • 1970-01-01
          • 2012-10-04
          • 1970-01-01
          • 2010-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多