Here is simple example of code:
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-f", "--file", dest="filename")
(options, args) = parser.parse_args()
print options
I have saved it to file and run. It works:
$ python script.py --file some_name
{'filename': 'some_name'}
But here is the trick:
$ python script.py --fil some_name
{'filename': 'some_name'}
It also works with undeclared option fil
.
Why it behaves in that way?
You can see how optparse works by opening the optparse.py
file in your python install.
On windows this was:
C:\Python27\Lib\optparse.py
The _match_abbrev
function is on line 1675:
def _match_abbrev(s, wordmap):
"""_match_abbrev(s : string, wordmap : {string : Option}) -> string
Return the string key in 'wordmap' for which 's' is an unambiguous
abbreviation. If 's' is found to be ambiguous or doesn't match any of
'words', raise BadOptionError.
"""
# Is there an exact match?
if s in wordmap:
return s
else:
# Isolate all words with s as a prefix.
possibilities = [word for word in wordmap.keys()
if word.startswith(s)]
# No exact match, so there had better be just one possibility.
if len(possibilities) == 1:
return possibilities[0]
elif not possibilities:
raise BadOptionError(s)
else:
# More than one possible completion: ambiguous prefix.
possibilities.sort()
raise AmbiguousOptionError(s, possibilities)
Which is called by _match_long_opt
which is called by _process_long_opt
This appears to be documented in this section of the documentation:
opt_str
is the option string seen on the command-line that’s triggering the callback. (If an abbreviated long option was used, opt_str will be the full, canonical option string—e.g. if the user puts --foo on the command-line as an abbreviation for --foobar, then opt_str will be "--foobar".)
If we changed the example you have provided to:
from optparse import OptionParser
parser = OptionParser()
parser.disable_interspersed_args()
parser.add_option("-f", "--file", dest="filename")
parser.add_option("-z", "--film", dest="filmname")
(options, args) = parser.parse_args()
print options
With the test case of --fil
, you get an error:
error: ambiguous option: --fil (--file, --film?)
So its ok to use shorter names but if there is any ambiguity optparse will stop.
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