【问题标题】:is there a argparse module that auto detects the data type是否有自动检测数据类型的 argparse 模块
【发布时间】:2019-12-27 12:10:27
【问题描述】:

是否有任何其他 python 包或 argparse 是否具有我所期待的以下功能

arg_parser.add_argument("-v", "--some_data", required=True,
                        help="data id(int) or vehicle name (str) ")
input -v 123 output type(args.some_data) --> int
input -v abc output type(args.some_data) --> str
input -v a12 output type(args.some_data) --> str

【问题讨论】:

  • 默认情况下,所有参数都被视为str,但您可以使用str.isnumericstr.isdecimal
  • 这种行为(自动“我知道你的意思”输入)通常被视为一种反特性——但你可以使用类似type=yaml.safe_load 的东西——或者你自己的函数来执行@987654327 @与int(...)
  • “0xff”的类型是什么——整数还是字符串?您应该明确定义规则,并拒绝猜测的诱惑。 argparse 中没有这样的“猜测”功能。
  • Pypi 存储库中有许多命令行解析器,一些基于argparse,其他从头开始解析。所以很难说有没有这个功能。 argparse 不这样做,但您可以编写自己的 type 函数来执行您想要的操作。该函数只需要接受一个字符串,并返回一些值(或引发错误)。剩下的就看你自己了。

标签: python python-3.x argparse


【解决方案1】:

您可以定义一个自定义的type 来尝试解析一个 int,如果解析失败,则返回该字符串。

(为简单起见,我在此示例中将您的选项作为参数。)

import argparse

def int_or_str(s):
    try:
        return int(s)
    except ValueError:
        return s

parser = argparse.ArgumentParser()
parser.add_argument("x", type=int_or_str, help="int or str")
print(parser.parse_args(['123']))  # -> Namespace(x=123)
print(parser.parse_args(['hello']))  # -> Namespace(x='hello')

但是,请注意 int 会忽略前导和尾随空格,因此例如 int(' 1 ') 会成功。

print(parser.parse_args([' 1 ']))  # -> Namespace(x=1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    相关资源
    最近更新 更多