python Protobuf json_format将数据类型从int更改为float

4jb9z9bj  于 2023-01-29  发布在  Python
关注(0)|答案(1)|浏览(197)

我有这样一条Python诏书:

{'class_name': 'InputLayer',
 'config': {'batch_input_shape': (None, 32),
  'dtype': 'float32',
  'sparse': False,
  'ragged': False,
  'name': 'input_5'}}

当我尝试使用json_format方法将其转换为protobuf消息时,它将config.batch_input_shape32int数据类型更改为float32.0
用于转换的代码(layer_config为上述dict):

import json
from google.protobuf import json_format
from google.protobuf import struct_pb2 as struct

json_format.Parse(json.dumps(layer_config), struct.Struct())

是否有办法避免从intfloat的类型转换?

我还尝试使用update方法进行转换,如下所示:

s = Struct()
s.update(layer_config)

而且还转换类型。

lhcgjxsq

lhcgjxsq1#

根据最初的研究,由于Python中数字的转换方式,这不是一个相对容易解决的问题
protobufs/well_known_types.py有一个方法_SetStructValue,用于类型转换,在处理数字时,我们同时对floatint进行类型检查。

def _SetStructValue(struct_value, value):
  if value is None:
    struct_value.null_value = 0
  elif isinstance(value, bool):
    # Note: this check must come before the number check because in Python
    # True and False are also considered numbers.
    struct_value.bool_value = value
  elif isinstance(value, str):
    struct_value.string_value = value
  elif isinstance(value, (int, float)):
    struct_value.number_value = value
  elif isinstance(value, (dict, Struct)):
    struct_value.struct_value.Clear()
    struct_value.struct_value.update(value)
  elif isinstance(value, (list, ListValue)):
    struct_value.list_value.Clear()
    struct_value.list_value.extend(value)
  else:
    raise ValueError('Unexpected type')

这里一个可能的解决方案是遍历有效负载对象图,并执行必要的类型转换以了解所需的类型。

相关问题