如何根据另一个论点提出一个论点?

时间:2019-04-28 14:23:43

标签: python python-2.7 argparse

给出一个小的解析器:

from argparse import ArgumentError, ArgumentParser
p = ArgumentParser()
p.add_argument('x', choices=['1', '2'])
p.add_argument('--y', required=False)
p.parse_args('1 --y 2'.split()) # this would work
p.parse_args('1'.split()) # this would work also

但是,我想确保如果x=='1',那么--y会得到一个值。我的实现是这样的:

args = p.parse_args('1 --y 2'.split())
if args.x=='1' and not args.y:
     raise ArgumentError('blah')

是否存在内部argparse方法? argparse引发解析错误时,它看起来要好得多

更好的是,我希望--y时需要x=='1' arg,而在x=='2'时不允许{em>

1 个答案:

答案 0 :(得分:0)

‘我想确保如果x =='1',那么--y会得到一个值”

您可以使用此:

from argparse import ArgumentParser
from sys import argv

p = ArgumentParser(prog='MyParser')

yIsRequired = (argv[1] == '1') # True if x == '1' else False

p.add_argument('x')            # Positional argument
p.add_argument(
    '--y',                     # Optional argument
    required=yIsRequired,
)

p = p.parse_args()

已全部测试。这段代码:

  • 检查sys.argv中是否有x

  • **如果x == '1',则yIsRequired设置为True

  • y的{​​{1}}参数设置为required的值

‘更好的是,我希望--y arg在x =='1'时是必需的,而在x =='2'时是不允许的

您在这里:

yIsRequired

结论:

  • from argparse import ArgumentParser import sys p = ArgumentParser(prog='Demo') yIsRequired = (sys.argv[1] == '1') p.add_argument('x') p.add_argument( '--y', required=yIsRequired, ) if sys.argv[1] == '2' and '--y' in sys.argv: # If x == 2 and y has a value sys.stderr.write('Demo: error: argument --y not allowed\n') # Write error to standard error output sys.exit(1) # Exit with non-zero exit code p = p.parse_args() 包含传递给脚本的所有参数(它是sys.argv
  • 您可以使用list检查是否已传递参数(布尔逻辑)
  • 有关删除/禁用参数的帮助,请参见this questionthis。答案很多,但是很多值得一读。