argparse使用特定的argumen重现“help”参数的行为

2024-03-28 14:52:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用pythonv2.7的argparse模块时遇到了一些问题。 基本上,我有一个脚本,有5个强制参数:

  1. 网址
  2. 方法
  3. 登录
  4. 密码
  5. 输出

语法示例如下:

script.py -w/--url [URL] -m/--method [METHOD] -l/--login [LOGIN] -p/--password [PASSWORD] -o/--output [OUTPUT]

我想做的是:

  • 添加可选参数-t/--test
  • 它的行为是,基于与-w/--url参数一起使用的url,它将完全绕过-m/--method-l/--login和{}参数,但是为了使其工作,我需要告诉{}停止处理参数,如果提供了-t/--test(但仅限于-w/--url)。在

这种行为有可能吗?我试图使用argparse子命令,但似乎(至少在我的小知识范围内)有点过火了。在

这是我的原始代码:

# Description : parses script arguments
# Argument(s) : all
# Return value : all arguments values
def testArgs():
    parser = argparse.ArgumentParser(description='Foo', formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('-w','--url', help='URL', required=True)
    parser.add_argument('-t','--test', help='Test command', action='store_true')
    parser.add_argument('-m','--method', help='METHOD', required=True)
    parser.add_argument('-u','--login_name', help='LOGIN', required=True)
    parser.add_argument('-p','--login_password', help='PASSWORD', required=True)
    parser.add_argument('-o','--output_format', help='OUTPUT', required=True, choices=['json', 'yaml', 'python'], default='json')
    args = parser.parse_args()
    return args

编辑:经过大量测试,我已经完成了以下工作:

^{pr2}$

表现出以下行为:

$ python testArgparse.py -h
usage: testArgeparse.py [-h] {test,cmd} ...

DESCRIPTION

positional arguments:
  {test,cmd}
    test      Lists all available methods
    cmd       Executes command

optional arguments:
  -h, --help  show this help message and exit

但要获得其他论点的帮助,我需要执行以下操作:

$ python testArgparse.py test -h
usage: testArgparse.py test [-h] -w W -t

optional arguments:
  -h, --help  show this help message and exit
  -w W        URL
  -t          Test


$ python testArgparse.py cmd -h
usage: testArgparse.py cmd [-h] -w W -m M -l L -p P -o O

optional arguments:
  -h, --help  show this help message and exit
  -w W        URL
  -m M        Method
  -l L        Login
  -p P        Password
  -o O        Output

我希望至少能够显示所有参数的帮助,而不必对testcmd参数使用--help。在

理想情况下,我希望这种行为:

$ python testArgparse.py [-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT]

Tags: pytestcmdaddtrueparserurl参数
1条回答
网友
1楼 · 发布于 2024-03-28 14:52:47

带有store_truerequired=True没有意义。默认值是False,但如果需要,返回值将始终是True。在

因为只有-w是无条件要求的,所以我将在其他所有内容上删除required参数。然后测试parse_args之后的所需值。我仍然可以发出argparse错误的用法。换句话说,做我自己的测试,而不是在argparse中尝试一些花哨的东西。在

def testArgs():
    usage = '[-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT]'
    parser = argparse.ArgumentParser(description='DESCRIPTION',usage=usage)
    parser.add_argument('-w', help='URL', required=True)
    parser.add_argument('-t', help='Test', action='store_true')
    parser.add_argument('-m', help='Method')
    parser.add_argument('-l', help='Login')
    parser.add_argument('-p', help='Password')
    parser.add_argument('-o', help='Output')
    args = parser.parse_args()

    # sample test, streamline and refine to suit your needs
    # this assumes the default for all these args is None
    if not args.t: # '-t' in in argv
        if any([args.m is None, args.l is None, args.p is None, args.o is None]):
            parser.error('m,l,p,o are all required')
    return args

1216:~/mypy$ python2.7 stack21070971.py
usage: [-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT]
stack21070971.py: error: argument -w is required

1213:~/mypy$ python2.7 stack21070971.py -w url
usage: [-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT]
stack21070971.py: error: m,l,p,o are all required

1213:~/mypy$ python2.7 stack21070971.py -w url -t
Namespace(l=None, m=None, o=None, p=None, t=True, w='url')

1214:~/mypy$ python2.7 stack21070971.py -w url -m mmm
usage: [-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT]
stack21070971.py: error: m,l,p,o are all required
...

1215:~/mypy$ python2.7 stack21070971.py -w url -m mmm -l uuu -p ppp -o ooo
Namespace(l='uuu', m='mmm', o='ooo', p='ppp', t=False, w='url')

相关问题 更多 >