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
来接收True
或False
。 这也保证了-lport
和-rport
在彼此之间有独立的行为。
当prox
没有设置时,你使用lport
吗? 如果没有,为什么不使用rport
lport
和rport
参数呢? 例如
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
不显示在帮助信息中