Опция Parser не соответствует аргументу - PullRequest
0 голосов
/ 04 июня 2018

У меня есть простой скрипт на Python (v2.7) ( test.py )

#!/usr/bin/python

import sys
from optparse import OptionParser

def main():
    parser = OptionParser()
    parser.add_option("--files", dest="files", 
                      metavar="FILES", default=None, 
                      help="A file pattern matching ottcall logs.")
    (options, args) = parser.parse_args()


    print "FILES_PATTERN %s" % options.files

    if not options.files:
        parser.error("Files_pattern option is mandatory - Abort execution.")

    return 0

if __name__ == "__main__":
    sys.exit(main())

Пользователь должен указать шаблон файла или имя файла

ВыполнитьСценарий в командной строке, если параметр отсутствует, возвращает ошибку:

python test.py
FILES_PATTERN None
Usage: test.py [options]

test.py: error: Files_pattern option is mandatory - Abort execution.

Если в файле параметров отсутствуют некоторые буквы (--fil вместо --files):

python test.py --fil "a_pattern_for_files"
FILES_PATTERN a_pattern_for_files

Я думаю, что у меня должна быть ошибка, подобная следующей

python test.py --fl "a_pattern_for_files"
Usage: test.py [options]

test.py: error: no such option: --fl

Почему я не получаю ошибку от OptionParser , когда я использую - fil вместо правильного аргумента - файлы ?

Не только я не получаю ошибку, но переменные файлы хранят значение: a_pattern_for_files (которое печатается).

Я ожидаю, что файлы аргументов будут иметь значение: Нет (по умолчанию), если только в командной строке - файлы не существуют

1 Ответ

0 голосов
/ 05 июня 2018

optparse позволяет сокращенные формы длинных опций.--fil - это префикс --files, а не префикс других длинных опций, поддерживаемых программой, поэтому --fil рассматривается как эквивалент --files.

Это едва упоминается в документации,и нет возможности отключить его.argparse имеет опцию для его отключения, но только в Python 3.5+.

...