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.
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 toFalse
.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With