Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Disable unique prefix matches for argparse and optparse

Tags:

When I use Python's argparse or optparse command line argument parser, any unique prefix of an argument is considered valid, e.g.

$ ./buildall.py --help usage: buildall.py [-h] [-f]  Build all repositories  optional arguments:   -h, --help   show this help message and exit   -f, --force  Build dirty repositories 

works with --help, --hel, --he for the help option as well as --forc and --fo for the force option.

Can this behavior be turned off somehow? I want to get an error message for incomplete arguments.

like image 983
Simon Warta Avatar asked Nov 24 '15 18:11

Simon Warta


2 Answers

The ability to disable abbreviated long options was only added in Python 3.5. From the argparse documentation:

The parse_args() method by default allows long options to be abbreviated to a prefix, if the abbreviation is unambiguous (the prefix matches a unique option) ... This feature can be disabled by setting allow_abbrev to False.

So if you're on Python 3.5, you can create your parser with allow_abbrev=False:

parser = argparse.ArgumentParser(..., allow_abbrev=False) 

If you're on optparse or pre-3.5 argparse, you just have to live with abbreviated options.

like image 141
user2357112 supports Monica Avatar answered Sep 23 '22 13:09

user2357112 supports Monica


For those of us still stuck on python2.7 for whatever reason, this is a minimal change to locally disable prefix matching:

class SaneArgumentParser(_argparse.ArgumentParser):   """Disables prefix matching in ArgumentParser."""   def _get_option_tuples(self, option_string):     """Prevent argument parsing from looking for prefix matches."""     return [] 

Now instead of using argparse.ArgumentParser, just use SaneArgumentParser. Unlike chepner's answer, this does not require any modification to the argparse module. It is also a much smaller change. Hopefully other people stuck in python's past will find this useful.

like image 21
itfische Avatar answered Sep 19 '22 13:09

itfische