optparse - 为什么选项的最后一个字符可以被忽略?使用 `--file` 和 `--fil` 的行为相同。

7

这里是一个简单的代码示例:

from optparse import OptionParser

parser = OptionParser()
parser.add_option("-f", "--file", dest="filename")

(options, args) = parser.parse_args()
print options

我已将其保存到文件并运行。它可以正常工作:
$ python script.py --file some_name
{'filename': 'some_name'}

但是这里有个诀窍:

$ python script.py --fil some_name
{'filename': 'some_name'}

它也可以与未声明的选项fil一起使用。为什么会出现这种行为?

比那好,--fi--f 对我也适用。我猜只要没有歧义,你可以少写一些字符。 - SiHa
如果您不想使用缩写词,较新版本的argparse(但不是已弃用的optparse)允许您禁用它 - Wander Nauta
2个回答

2
你可以通过打开Python安装目录下的optparse.py文件来了解optparse的工作原理。
在Windows上,该文件位于:

C:\Python27\Lib\optparse.py

“_match_abbrev”函数位于第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)

这句话的意思是:“_match_long_opt”被“_process_long_opt”调用,这两个函数都是在处理长选项时被调用的。”
这段文字提到了一个文档中的章节this,其中说明了一个“opt_str”的概念。它是在命令行上触发回调的选项字符串。(如果使用缩写的长选项,则opt_str将是完整的规范选项字符串——例如,如果用户在命令行上输入“--foo”作为“--foobar”的缩写,则opt_str将是“--foobar”。)
如果我们将您提供的示例更改为:
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

使用测试用例 --fil,您会收到一个错误:
error: ambiguous option: --fil (--file, --film?)

所以使用较短的名称是可以的,但如果存在歧义,optparse会停止。

感谢您详细的回复。下次我应该更仔细地阅读文档😊 - dimadvk

2
optparse会尝试将部分或较短的选项与所有可用的较长选项名称进行匹配。虽然它的文档不是特别完善,但它一直这样做。请尝试在https://docs.python.org/2/library/optparse.html#how-callbacks-are-called中搜索abbrev以获取更多信息。许多其他选项解析库也会这样做。请注意,optparse现已被弃用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接