getopt: параметр со значением по умолчанию

Возможно ли объяснить getopt, что на входе может быть параметр, который может содержать, а может и не содержать аргумента? Если я делаю так:

import getopt
import sys

optlist, args = getopt.getopt(sys.argv[1:], "b:")
for (x, y) in optlist:
    print x, y

и запускаю скрипт без аргумента у параметра $ python t.py -b, то получаю на выходе ошибку

getopt.GetoptError: option -b requires argument.

А если делаю так:

optlist, args = getopt.getopt(sys.argv[1:], "b")

и запускаю скрипт с параметром, содержащим аргумент $ python t.py -b 11, то он этот аргумент не распознаёт.

Или по другому, можно ли задать параметру значение по умолчанию?

Нужно, чтобы я мог в командной строке:

  1. не указывать параметр - значит его нет;
  2. указывать параметр без аргумента - значит параметр есть, а его значения равно None или оно берётся по умолчанию;
  3. указывать параметр с аргументом - значит есть параметр и он имеет значение

Ответы (1 шт):

Автор решения: insolor

Покопался в исходниках argparse, итог такой: можно вызывать не метод parse, а внутренний метод _parse_known_args, передавая в него пустой Namespace, тогда при отсутствии ключа он не будет появляться внутри Namespace (правда, так не будет учитываться параметр default в add_argument):

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-b', type=int, nargs='?')


def test(args):
    print(args, parser._parse_known_args(args, argparse.Namespace())[0])


test([])
test(['-b'])
test(['-b', '42'])

Вывод (Python 2.7):

([], Namespace())
(['-b'], Namespace(b=None))
(['-b', '42'], Namespace(b=42))

Лучше, конечно, не использовать внутренние методы напрямую, но если очень хочется, то можно.

→ Ссылка