Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 argparse:如何正确嵌套可选的互斥参数?_Python_Python 2.7_Command Line Arguments_Argparse - Fatal编程技术网

Python 2.7 argparse:如何正确嵌套可选的互斥参数?

Python 2.7 argparse:如何正确嵌套可选的互斥参数?,python,python-2.7,command-line-arguments,argparse,Python,Python 2.7,Command Line Arguments,Argparse,我的程序应包括以下选项,并由以下人员正确解析: 纯可选:[-h,--help]和[-v,--version] 相互排斥:[-f文件,--FILE文件]和[-u URL,--URL URL URL] 如果选择了--url,则为可选:[-V,--verbose] 如果选择了--file或--url,则需要:[-F,--format format] 理想的使用模式是: prog.py [-h] [-v] [-f FILE (-F FORMAT) | -u URL [-V] (-F FORMAT) ]

我的程序应包括以下选项,并由以下人员正确解析:

  • 纯可选:
    [-h,--help]
    [-v,--version]
  • 相互排斥:
    [-f文件,--FILE文件]
    [-u URL,--URL URL URL]
  • 如果选择了
    --url
    ,则为可选:
    [-V,--verbose]
  • 如果选择了
    --file
    --url
    ,则需要:
    [-F,--format format]
  • 理想的使用模式是:

    prog.py [-h] [-v] [-f FILE (-F FORMAT) | -u URL [-V] (-F FORMAT) ]
    
    -F
    要求适用于互斥组的两个成员。
    我不确定这是否是一场灾难

    因此,应该可以运行:

    prog.py -u "http://foo.bar" -V -F csv
    
    解析器尖叫着,以防我忘记了
    -F
    (他应该这么做的)

    到目前为止我所做的:

    parser = ArgumentParser(decription='foo')
    
    group = parser.add_mutually_exclusive_group()    
    group.add_argument('-f','--file', nargs=1, type=str, help='')
    group.add_argument('-u','--url', nargs=1, type=str, help='')    
    
    parser.add_argument('-V','--verbose', action='store_true', default=False, help='')
    parser.add_argument('-F','--format', nargs=1, type=str, help='')
    
    因为它有一个“普通模式”可以在没有命令行参数的情况下运行,所以所有参数都必须是可选的

    如何实施第3点。四,。输入我的代码

    编辑:

    如前所述,我尝试将
    -f
    -u
    作为子parser,但子命令似乎被视为位置命令,解析器给了我一个
    错误:如果我在没有参数的情况下运行它,参数太少了。

    当存在某个选项时,可以使用方法在
    optparse
    中强制执行这些点

    但是,在
    argparse
    中,这些选项不可用

    您可以为
    url
    file
    子选项添加一个,并分别解析它们。 从帮助中:

    请注意,parse_args()返回的对象将只包含 命令行选择的主解析器和子解析器 (而不是任何其他子帕斯)。因此,在上面的示例中,当 如果指定,则仅存在foo和bar属性,并且当 如果指定,则仅存在foo和baz属性

    但是我只想正确地记录用法,忽略那些不正确的参数 适用

    e、 g.让这两个命令行的行为完全相同:

    prog.py -f FILE -V
    prog.py -f FILE
    

    使用nargs=2和tuple metavar接近您的目标

    parser = argparse.ArgumentParser(prog='PROG')
    group = parser.add_mutually_exclusive_group()
    group.add_argument('-f','--file', nargs=2, metavar=('FILE','FORMAT'))
    group.add_argument('-u','--url', nargs=2, metavar=('URL','FORMAT'))
    parser.add_argument('-V','--verbose', action='store_true',help='optional with url')
    
    产生:

    usage: PROG [-h] [-f FILE FORMAT | -u URL FORMAT] [-V]
    
    optional arguments:
      -h, --help            show this help message and exit
      -f FILE FORMAT, --file FILE FORMAT
      -u URL FORMAT, --url URL FORMAT
      -V, --verbose         optional with url
    
    这需要文件名或url的格式,只是不需要
    -F
    。如其他人所述,在
    -f
    情况下可以忽略
    -V


    我尝试将-f和-u作为子parser,如下所述,但是子命令似乎被视为位置命令,解析器给了我一个错误:如果我在没有参数的情况下运行它,那么参数太少

    在最新版本中,子命令不再视为必需的位置。据我所知,这是将错误消息更改为更具信息性的一个副作用。代替
    \u parse\u known\u args
    执行以下操作:

        if positionals:
            self.error(_('too few arguments'))
    
    它扫描
    \u操作
    ,查看需要哪些操作,然后在错误消息中按名称列出这些操作。这将在中讨论。我知道这个变化正在发展中(3.4),也可能在3.3中



    你考虑过吗?缺点是它允许选项值以
    -
    开头,是否需要
    -f
    -u
    中的一个?如果是这样,我正在描绘一个包含子命令或位置参数的解决方案。@chepner:不,它们不是。我希望该程序也运行没有参数和选项,所以它将启动一个用户对话框,甚至GUI@J.F.Sebastian:
    docopt
    看起来不错,我会深入研究并报告它是否适合我的需要
    argparse
    内置了对参数数量可变的选项的支持,以及处理参数的自定义操作一个给定的选项。但是,我同意在这种情况下,最简单的方法是只允许使用
    -V
    ,如果使用
    -f
    ,则忽略它。
    optpasse
    被弃用,而
    argparse
    则被替换。见: