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, то он этот аргумент не распознаёт.
Или по другому, можно ли задать параметру значение по умолчанию?
Нужно, чтобы я мог в командной строке:
- не указывать параметр - значит его нет;
- указывать параметр без аргумента - значит параметр есть, а его значения равно None или оно берётся по умолчанию;
- указывать параметр с аргументом - значит есть параметр и он имеет значение
Ответы (1 шт):
Покопался в исходниках 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))
Лучше, конечно, не использовать внутренние методы напрямую, но если очень хочется, то можно.