Argparse:如果存在“x”,则需要参数“y”

我有一个要求如下:

./xyifier --prox --lport lport --rport rport 

对于参数prox,我使用action ='store_true'来检查它是否存在。 我不需要任何的论据。 但是,如果设置了–prox,我需要 rport和lport。 有没有写一个简单的方法与argparse编写自定义条件编码。

更多代码:

 non_int.add_argument('--prox', action='store_true', help='Flag to turn on proxy') non_int.add_argument('--lport', type=int, help='Listen Port.') non_int.add_argument('--rport', type=int, help='Proxy port.') 

不,没有任何select可以作出相互包容的select。

处理这个问题最简单的方法是:

 if args.prox and args.lport is None and args.rport is None: parser.error("--prox requires --lport and --rport.") 

你在谈论有条件需要的论据。 就像@borntyping说的,你可以检查错误并执行parser.error() ,或者当你添加一个新的参数时,你可以应用与--prox相关的需求。

你的例子的一个简单的解决scheme可能是:

 non_int.add_argument('--prox', action='store_true', help='Flag to turn on proxy') non_int.add_argument('--lport', required='--prox' in sys.argv, type=int) non_int.add_argument('--rport', required='--prox' in sys.argv, type=int) 

这种方式required根据用户是否使用--prox来接收TrueFalse 。 这也保证了-lport-rport在彼此之间有独立的行为。

prox没有设置时,你使用lport吗? 如果没有,为什么不使用rport lportrport参数呢? 例如

 parser.add_argument('--prox', nargs=2, type=int, help='Prox: listen and proxy ports') 

这可以节省您的用户input。 if args.prox is not None: ,就很容易testingif args.prox is not None: if args.prox:

如何使用parser.parse_known_args()方法,然后根据需要添加--lport--rport参数args如果存在--prox

 # just add --prox arg now non_int = argparse.ArgumentParser(description="stackoverflow question", usage="%(prog)s [-h] [--prox --lport port --rport port]") non_int.add_argument('--prox', action='store_true', help='Flag to turn on proxy, requires additional args lport and rport') opts, rem_args = non_int.parse_known_args() if opts.prox: non_int.add_argument('--lport', required=True, type=int, help='Listen Port.') non_int.add_argument('--rport', required=True, type=int, help='Proxy port.') # use options and namespace from first parsing non_int.parse_args(rem_args, namespace = opts) 

另请注意,您可以提供第一次parsing后生成的名称空间opts ,而第二次parsing剩余的参数。 这样,最后,在完成所有parsing之后,您将拥有包含所有选项的单个命名空间。

缺点:

  • 如果--prox不存在,另外两个依赖选项甚至不存在于命名空间中。 虽然根据你的用例,如果--prox不存在,其他选项会发生什么变化是无关紧要的。
  • 由于parsing器不知道完整的结构,因此需要修改使用消息
  • --lport--rport不显示在帮助信息中