@PyJa
Инженер

Как работает модуль getopt из стандартной библиотеки Python?

Прошу объяснить пример из стандартной документации python getopt .
В частности откуда взять функцию usage()? Почему такие разные параметры sys.exit() и sys.exit(2)? Какую роль выполняет переменная verbose? Что делает команда assert False ...?

import getopt, sys
def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
    except getopt.GetoptError as err:
        # print help information and exit:
        print(err) # will print something like "option -a not recognized"
        usage()
        sys.exit(2)
    output = None
    verbose = False
    for o, a in opts:
        if o == "-v":
            verbose = True
        elif o in ("-h", "--help"):
            usage()
            sys.exit()
        elif o in ("-o", "--output"):
            output = a
        else:
            assert False, "unhandled option"

if __name__ == "__main__":
    main()
  • Вопрос задан
  • 2342 просмотра
Решения вопроса 1
@nirvimel
Просто совет: перед тем как углубятся в изучение getopt, обратите внимание на Click, это высокоуровневая обертка над argparse/optparse (высокоуровневая альтернатива getopt), призванная решать многие из тех проблем, которые в вашем коде решаются вручную, а также многие проблемы, с которыми вы еще скоро столкнетесь при разработке консольных приложений.

В частности откуда взять функцию usage()?

Эта функция должна печатать в консоль что-то о том, как следует правильно вызывать ваш скрипт и с какими параметрами.

Почему такие разные параметры sys.exit() и sys.exit(2)?

Это должно сигнализировать ОС или вызывающему скрипту о том, отработал ли процесс нормально (код возврата == 0, по умолчанию не указывается) или завершился с ошибкой (код возврата > 0).

Какую роль выполняет переменная verbose?

Во многих unix-утилитах режим verbose означает вывод более подробной информации о ходе работы, без него процесс может отработать (штатно, без ошибок) вообще молча без какого-либо вывода. Ваша реализация остается на ваше усмотрение.

Что делает команда assert False ...?

Она должна ставится в точке, до которой по логике интерпретатор не должен дойти при любом раскладе. В данном случае, ИМХО, ее применение необоснованно, правильнее будет просто написать в консоль что-то типа "unhandled option" и выйти по sys.exit(n) где n > 0.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@abcd0x00
Используй argparse.

Прошу объяснить пример из стандартной документации python getopt

А к getopt эти вопросы никакого отношения не имеют, вообще никакого отношения.

В частности откуда взять функцию usage()? Почему такие разные параметры sys.exit() и sys.exit(2)? Какую роль выполняет переменная verbose? Что делает команда assert False ...?

usage() и verbose - это просто самодельные вещи, которые можно любыми написать.
https://docs.python.org/3/library/sys.html#sys.exit
https://docs.python.org/3/reference/simple_stmts.h...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы