mutually_exclusive_group with optional and positional argument

后端 未结 1 727
故里飘歌
故里飘歌 2021-01-23 04:35

I created an cli specification with docopt which works great, however for some reason I have to rewrite it to argparse

Usage:
    update_store_products 

        
1条回答
  •  执念已碎
    2021-01-23 05:17

    First off, you should include the shortest code necessary to reproduce the error in the question itself. Without it an answer is just a shot in the dark.

    Now, I'm willing to bet your argparse definitions look a bit something like this:

    parser = ArgumentParser()
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('--all', action='store_true')
    group.add_argument('store_name', nargs='*')
    

    The arguments in a mutually exclusive group must be optional, because it would not make much sense to have a required argument there, as the group could then only have that argument ever. The nargs='*' alone is not enough – the required attribute of the created action will be True – to convince the mutex group that the argument is truly optional. What you have to do is add a default:

    parser = ArgumentParser()
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('--all', action='store_true')
    group.add_argument('store_name', nargs='*', default=[])
    

    This will result in:

    [~]% python2 arg.py
    usage: arg.py [-h] (--all | store_name [store_name ...])
    arg.py: error: one of the arguments --all store_name is required
    
    [~]% python2 arg.py --all
    Namespace(all=True, store_name=[])
    
    [~]% python2 arg.py store1 store2 store3
    Namespace(all=False, store_name=['store1', 'store2', 'store3'])
    

    0 讨论(0)
提交回复
热议问题