【问题标题】:argparse: dependency between multiple optional positional argumentsargparse:多个可选位置参数之间的依赖关系
【发布时间】:2012-10-09 07:32:10
【问题描述】:

我正在寻找一种方法来使用 python3 中的 argparse 模块解析以下命令行语法:

myapp.py [folder] [[from] to]

含义:用户可以随意定义一个文件夹,默认为cwd。此外,用户最多可以传递两个整数。如果只给出一个数字,它应该存储在to 变量中。这类似于python内置range()的语法。

例如:

myapp.py folder
myapp.py 10
myapp.py 5 10
myapp.py folder 5 10
myapp.py folder 10

这可能吗?如果有,怎么做?

【问题讨论】:

  • argparse 应该如何区分 myapp foldermyapp 10?据我所知,除了对返回的命名空间进行后处理之外,您别无选择——此时,您不妨只处理sys.argv

标签: python python-3.x command-line-arguments argparse


【解决方案1】:

使用选项;这就是他们的目的(以及 argparse 擅长解析的内容)。

因此,类似的语法

myapp.py [-F folder] [[from] to]

会更有意义,并且更容易解析。

【讨论】:

    【解决方案2】:

    你可以做一些很傻的事情:

    import argparse
    import os
    
    class MyAction(argparse.Action):
        def __call__(self,parser,namespace,values,option_string=None):
            namespace.numbers = []
            namespace.path = os.getcwd()
            for v in values:
                if os.path.isdir(v):
                    namespace.path = v
                else:
                    try:
                        namespace.numbers.append(int(v))
                        if len(namespace.numbers) > 2
                           parser.error("Barg2!!!")
                    except ValueError:
                        parser.error("Barg!!!")
    
    p = argparse.ArgumentParser()
    p.add_argument('stuff',nargs='*',action=MyAction)
    n = p.parse_args()
    print n
    

    但如果你打算这样做,你不妨自己处理sys.argv——你真的应该考虑在这里使用实际选项...

    【讨论】:

    • holy sh** ... 很棒的答案,但我会听从你的 sys.argv 建议
    【解决方案3】:

    我还建议自己解析 sys.argv。

    FWIW,即使在 argparse 或类似的项目中,我也会解析 sys.argv,因为自己解析 sys.argv 与 pylint 或 flake8 配合得很好。

    【讨论】:

      【解决方案4】:

      如果不使用文件夹的命名参数,我看不到任何方法:

      # usage: argparsetest2.py [-h] [--folder [FOLDER]] [to] [fr]
      
      import argparse
      import os
      
      parser = argparse.ArgumentParser()
      parser.add_argument('--folder', dest='folder', nargs='?', default=os.getcwd())
      parser.add_argument('to', type=int, nargs='?')
      parser.add_argument('fr', type=int, nargs='?')
      args = parser.parse_args()
      
      print args
      

      【讨论】:

      • 应该是[to] [from],而不是[[from] to]
      • @FabianHenze 我认为这是获得您想要的位置行为的唯一方法。如果您颠倒顺序,则将一个整数分配给“from”而不是“to”。唯一的其他选项(无论如何argparse)是使用所有命名参数,例如myapp.py --folder <folder> -- from <from> --to <to>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2011-05-27
      • 2019-04-13
      • 2014-12-29
      相关资源
      最近更新 更多