dWitty
dWitty

Reputation: 524

Removing arguments from python/argparse (without using parse_known_args)

I have two programs, one is a wrapper of the other.

Main program has args order-arg-one, --arg1, --arg2 Wrapper program has all the args of main program, and additional args --arg3 , --arg4

I want to be able to pass the arguments from the wrapper to the main program without getting an 'argument not recognized' error. However, I do not want to use parse_known_args, because then the user receives zero feedback if they made a typo or used a nonsensical argument. (I have already seen this question)

Other than manually searching for every single argument name, and then any value coming immediately after that name if the name is present and its an argument that expects a parameter after is, is there a more elegant way of cleaning my arguments of some set of values in order to pass them on to another parser?

Upvotes: 2

Views: 3798

Answers (1)

hpaulj
hpaulj

Reputation: 231355

An example of mixing various partial 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)

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) []

all:

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']

subsets

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']

error - caught by parser12:

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

Upvotes: 3

Related Questions