2017-02-17 9 views
1

argparse применяет преобразование типов к аргументам параметров и значениям по умолчанию, если значения по умолчанию являются строками. Тем не менее, кажется, что это не делает этого для позиционных аргументов:Как преобразовать тип применения argparse в значение по умолчанию для позиционных аргументов?

import argparse as ap 

p = ap.ArgumentParser() 
p.add_argument('file', nargs='*', 
       metavar='FILE', 
       default='-', 
       type=ap.FileType(), 
       help='Input files. - is stdin. Default: %(default)s') 

print(p.parse_args([])) 
# Namespace(file='-') 
print(p.parse_args(['-'])) 
# Namespace(file=[<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>]) 

(Ideone)

Если изменить file к --file так, что эти аргументы опции, значение default преобразуется, как и ожидалось.

Есть ли у меня какие-либо варианты лучше, чем прямое пропускание argparse.FileType()('-') как default?

ответ

1

Значения, введенные в sys.argv, всегда являются объектами str, поскольку базовая конструкция операционной системы представляет собой массив символов символов C. Вам нужно type, чтобы преобразовать их в другой тип Python.

Значение default, однако, не имеет таких ограничений. Вы можете использовать значение любого типа, подходящего для аргумента ключевого слова.

p.add_argument('file', 
       nargs='*', 
       metavar='FILE', 
       default=[sys.stdin], 
       type=ap.FileType(), 
       help='Input files. - is stdin. Default: standard input') 

Я изменил помощь; получение значения repr(sys.stdin) не является особенно полезным, и пользователя не следует путать, описывая значение по умолчанию, а не указывая точный объект Python.

+0

Я понимаю первую часть достаточно хорошо, но я не вижу, как это имеет к этому какое-то отношение. Что касается второго, что, если файл по умолчанию, который я использую, это ''/some/file'' вместо '' -''? – muru

+0

'default = ap.FileType ('/ some/file')'. Значение по умолчанию просто не подлежит обработке определенным типом. – chepner

+0

(Я проверяю исходный код, однако, чтобы убедиться, что у меня что-то не хватает. Это сложный процесс.) – chepner

 Смежные вопросы

  • Нет связанных вопросов^_^