从 python/argparse 中删除参数(不使用 parse_known_args)
Removing arguments from python/argparse (without using parse_known_args)
我有两个程序,一个是另一个的包装。
主程序有参数 order-arg-one, --arg1, --arg2
包装程序具有主程序的所有参数,以及附加参数 --arg3 、 --arg4
我希望能够将参数从包装器传递到主程序而不会出现 'argument not recognized' 错误。但是,我 不想 使用 parse_known_args,因为如果用户输入错误或使用无意义的参数,那么他们将收到零反馈。 (我已经看过)
除了手动搜索每个参数名称,然后搜索紧跟在该名称之后的任何值(如果该名称存在且其后需要一个参数的参数),是否有更优雅的方式来清理我的参数一组值以便将它们传递给另一个解析器?
混合各种部分解析的示例:
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)
None:
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
我有两个程序,一个是另一个的包装。
主程序有参数 order-arg-one, --arg1, --arg2 包装程序具有主程序的所有参数,以及附加参数 --arg3 、 --arg4
我希望能够将参数从包装器传递到主程序而不会出现 'argument not recognized' 错误。但是,我 不想 使用 parse_known_args,因为如果用户输入错误或使用无意义的参数,那么他们将收到零反馈。 (我已经看过
除了手动搜索每个参数名称,然后搜索紧跟在该名称之后的任何值(如果该名称存在且其后需要一个参数的参数),是否有更优雅的方式来清理我的参数一组值以便将它们传递给另一个解析器?
混合各种部分解析的示例:
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)
None:
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