【问题标题】:Multiple type support (float, int and string) in argparseargparse 中的多种类型支持(float、int 和 string)
【发布时间】:2021-08-14 11:21:34
【问题描述】:

我正在使用 json 和 python 与服务器通信,我想用 argparse 定义数据的类型。有没有办法支持 Int 和 Float 和 String?我知道默认情况下 argparse 参数是字符串。

在下面的sn-p中,我想发送一个jsonArray,可以发送不同的数据类型(目前它唯一的int)。

parser.add_argument("-v", "--value", nargs="+", default=[0], type=int, help="Values that will be written (Only Write and WriteComplete)")

我有一个数据类型参数。这是在服务器处理我的请求后用于通信的设备所需要的。

parser.add_argument("-dt", "--data-type", help="Data type of the sub indices (i.e. \"uint32\")")

所以我想用这个参数来定义它是浮点数、整数还是字符串。

【问题讨论】:

  • 如何判断一个值是 int 还是 float 还是 string?应该是字符串的数字呢?
  • 您是在尝试解释 literals 吗?如"1.2"str4.5float42int
  • 我有一个数据类型参数。这是在服务器处理我的请求后用于通信的设备所需要的。 parser.add_argument("-dt", "--data-type", help="子索引的数据类型 (ie \"uint32\")") 所以我想用这个参数来定义它是否是浮点数、整数或字符串。
  • 似乎 argument 本身仍然是 str,然后您自己的代码必须进行解释。
  • argparse 无法连接两个参数。您必须编写自己的代码,根据data_type 解释value

标签: python python-3.x argparse


【解决方案1】:

事实证明你不能将两个参数连接在一起。我对此的解决方案是创建一个函数来比较我想要交互的两个参数。

def convertValue(value, dataType):
    intTypes = ["int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64"]
    if dataType in intTypes:
        return int(value, 0)

    floatTypes = ["float", "double"]
    if dataType in floatTypes:
        return float(value)

    return value

在生成 JSON 请求时,我调用了上述函数。

"data": {
    "values": [convertValue(v, dataType) for v in value],
    "type": dataType,
}

【讨论】:

  • 您也可以使用dict 编写您的convertValue:给定converters = {"int8": int, "int16": int, ..., "float": float, "double": float},您可以将其用作coverters.get(data_type, lambda x: x)(value)。这具有 O(1) 查找与 O(n) 查找相比的额外好处。
猜你喜欢
  • 2021-06-16
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 2013-05-08
  • 2013-04-12
相关资源
最近更新 更多