如何使 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 对象而感到困惑。
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 对象而感到困惑。