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

How can I make argparse apply type conversion to default value of positional arguments?

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 更好的选择吗?

放入 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 对象而感到困惑。