从python/argparse中删除参数(不使用parse_known_args)

问题描述:

我有两个程序,一个是另一个的包装。从python/argparse中删除参数(不使用parse_known_args)

主要程序有ARGS订单ARG-之一,--arg1,--arg2 包装程序主要有程序的所有指定参数时,和额外的参数--arg3,--arg4

我想成为能够将包装中的参数传递给主程序,而不会发生“无法识别的参数”错误。但是,我做而不是想使用parse_known_args,因为如果用户输入了错字或使用了无意义的参数,那么用户会收到零反馈。 (我已经看到this question

除了手动搜索每个单一参数名称,然后紧接在该名称后面出现的任何值(如果该名称存在并且它的参数需要后面的参数),是否还有更多为了将它们传递给另一个解析器而清理我的一些值集合的优雅方式?

+1

给一些示例代码,以明确这是怎么回事。如果包装器处理所有参数,主体是否忽略它不能处理的参数并不重要。在链接的答案中,第一个解析器使用partial,并将附加内容传递给第二个解析器。您可以尝试使用一个虚拟分析器来捕获'arg3/4',并将其余的作为其“extras”。 – hpaulj

混合各种局部parsings的一个例子:

import argparse 

def foo(parser, alist): 
    for arg in alist: 
     parser.add_argument('--'+arg, action='store_true') 

parser1 = argparse.ArgumentParser() 
foo(parser1, ['arg1','arg2']) 

parser2 = argparse.ArgumentParser() 
foo(parser2, ['arg3','arg4']) 

parser12 = argparse.ArgumentParser() 
foo(parser12, ['arg1','arg2','arg3','arg4']) 

args = parser12.parse_args() 
print('p12', args) 

args, extras = parser2.parse_known_args() 
print('p2',args, extras) 

args = parser1.parse_args(extras) 
print('p1',args) 

args, extras = parser1.parse_known_args() 
print('p1p',args, extras) 

无:

1714:~/mypy$ python3 stack47866170.py 
p12 Namespace(arg1=False, arg2=False, arg3=False, arg4=False) 
p2 Namespace(arg3=False, arg4=False) [] 
p1 Namespace(arg1=False, arg2=False) 
p1p Namespace(arg1=False, arg2=False) [] 

所有:

1722:~/mypy$ python3 stack47866170.py --arg1 --arg2 --arg3 --arg4 
p12 Namespace(arg1=True, arg2=True, arg3=True, arg4=True) 
p2 Namespace(arg3=True, arg4=True) ['--arg1', '--arg2'] 
p1 Namespace(arg1=True, arg2=True) 
p1p Namespace(arg1=True, arg2=True) ['--arg3', '--arg4'] 

子集

1723:~/mypy$ python3 stack47866170.py --arg1 --arg2 
p12 Namespace(arg1=True, arg2=True, arg3=False, arg4=False) 
p2 Namespace(arg3=False, arg4=False) ['--arg1', '--arg2'] 
p1 Namespace(arg1=True, arg2=True) 
p1p Namespace(arg1=True, arg2=True) [] 
1723:~/mypy$ python3 stack47866170.py --arg1 --arg3 
p12 Namespace(arg1=True, arg2=False, arg3=True, arg4=False) 
p2 Namespace(arg3=True, arg4=False) ['--arg1'] 
p1 Namespace(arg1=True, arg2=False) 
p1p Namespace(arg1=True, arg2=False) ['--arg3'] 

错误 - 由parser12抓住:

1724:~/mypy$ python3 stack47866170.py --arg1 --foo 
usage: stack47866170.py [-h] [--arg1] [--arg2] [--arg3] [--arg4] 
stack47866170.py: error: unrecognized arguments: --foo 
+0

这只适用于可选参数,但如果每个解析器都有位置参数,它不是一个解决方案...尽管如此,接受 – dWitty

+0

是的,当使用多个解析器时,位置会很难处理。它可能工作,如果只解析这些。 – hpaulj