【问题标题】:How can I make argparse apply type conversion to default value of positional arguments?如何使 argparse 将类型转换应用于位置参数的默认值?
【发布时间】:2017-07-06 23:33:03
【问题描述】:

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

【问题讨论】:

    标签: python argparse


    【解决方案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 对象而感到困惑。

    【讨论】:

    • 我对第一部分理解得很好,但我不明白这与这有什么关系。至于第二种,如果我使用的默认文件是'/some/file'而不是'-'呢?
    • default=ap.FileType('/some/file')。默认值根本不受定义类型的处理。
    • (不过,我正在检查源代码,以确保我没有遗漏任何东西。这是一个复杂的过程。)
    • * 和 ? 的默认值位置以特殊方式处理。这种位置总是seen,因为空列表满足它的 nargs 要求。相关代码位于名为 IRC _get_values 的方法中。处理默认值是一项复杂的工作。
    • 我找不到与此问题相关的任何其他错误/问题; argparse 补丁以蜗牛的速度进行,以避免向后兼容性问题。坚持使用[sys.stdin] 方法。它更简单 - 并为您提供更多控制权。 type 转换默认值(几乎)总是方便,而不是必需。
    猜你喜欢
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 2021-08-01
    • 2017-09-12
    • 2015-09-28
    • 2018-01-22
    • 2017-10-13
    • 1970-01-01
    相关资源
    最近更新 更多