如何将argparse应用类型转换为位置参数的默认值?

时间:2017-02-17 12:26:29

标签: python 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 个答案:

答案 0 :(得分: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对象来混淆用户。