How to parse positional arguments with leading minus sign (negative numbers) using argparse

前端 未结 2 540
野趣味
野趣味 2020-12-09 09:45

I would like to parse a required, positional argument containing a comma-separated list of integers. If the first integer contains a leading minus (\'-\') sign, argparse co

相关标签:
2条回答
  • 2020-12-09 10:40

    You need to insert a -- into your command-line arguments:

    $ python example.py --test -- -1,2,3,4
    Namespace(positional='-1,2,3,4', test=True)
    

    The double-dash stops argparse looking for any more optional switches; it's the defacto standard way of handling exactly this use case for command-line tools.

    0 讨论(0)
  • 2020-12-09 10:43

    From the documentation:

    The parse_args() method attempts to give errors whenever the user has clearly made a mistake, but some situations are inherently ambiguous. For example, the command-line argument -1 could either be an attempt to specify an option or an attempt to provide a positional argument. The parse_args() method is cautious here: positional arguments may only begin with - if they look like negative numbers and there are no options in the parser that look like negative numbers:

    Since -1,2,3,4 does not look like a negative number you must "escape" it with the -- as in most *nix systems.

    An other solution would be to use nargs for the positional and pass the numbers as space separated:

    #test.py
    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('positional', nargs='*') #'+' for one or more numbers
    
    print parser.parse_args()
    

    Output:

    $ python test.py -1 2 3 -4 5 6
    Namespace(positional=['-1', '2', '3', '-4', '5', '6'])
    

    A third way to obtain what you want is to use parse_known_args instead of parse_args. You do not add the positional argument to the parser and parse it manually instead:

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('--test', action='store_true')
    
    parsed, args = parser.parse_known_args()
    print parsed
    print args
    

    Result:

    $ python test.py  --test -1,2,3,4                                            
    Namespace(test=True)
    ['-1,2,3,4']    
    

    This has the disadvantage that the help text will be less informative.

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