使用变化的参数在python中进行函数分派

时间:2018-07-03 16:20:19

标签: python dispatch

我有许多以下类型的记录,它们的属性值在字符串中

{
  "City": "Pune",
  "Temperature": "32",
  "Unit": "C",
  "Date": "22-11-2012"
}

以及定义数据类型和其他属性属性的关联记录描述符

{
  "City": {
    "datatype": "string"
  },
  "Temperature": {
    "datatype": "double"
  },
  "Unit": {
    "datatype": "string"
  },
  "Date": {
    "datatype": "datetime",
    "dateformat": "%d-%m-%Y",
    "timezone": "UTC"
  }
}

我需要将记录属性值从字符串转换为记录描述符中提到的适当数据类型

我有一个函数调度字典

{
   "int" : string_to_int,
   "double": string_to_double,
   "bool": string_to_bool,
   "datetime": string_to_datetime
}

def string_to_int(value):
    <<convert to integer>>

def string_to_double(value):
    <<convert to double>>

def string_to_bool(value):
    <<convert to bool>>

def string_to_datetime(value, date_format, time_zone):
    <<convert to datetime>>

通过遍历每个属性,如何在python中执行函数分派以将属性值转换为适当的数据类型?在循环中不使用任何if..else逻辑的情况下,传递额外参数进行数据时间转换的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

要回答您的特定问题,如果您将类型名称修改为函数映射以存储函数本身,而不是函数名称,则为

type_to_function_map = {
   "int" : string_to_int,
   "double": string_to_double,
   "bool": string_to_bool,
   "datetime": string_to_datetime
}

然后将其他参数更改为string_datetime之类的函数作为关键字参数:

def string_to_datetime(value, date_format=None, time_zone=None):
    pass

您可以轻松编写类似的功能:

def load(payload, schema)
    output = {}
    for k, v in payload.items():
        field_info = schema[k].copy()
        output[k] = type_to_function_map[field_info.pop("datatype")](v, **field_info)

    return output

但是,话虽如此,有许多库可以做您想做的更好的事情。我个人最喜欢的是marshmallow

from marshmallow import fields, Schema

class MySchema(Schema):
    City = fields.String()
    Temperature = fields.Float()
    Unit = fields.String()
    Date = fields.DateTime("%d-%m-%Y")

然后您可以像这样使用:

MySchema().loads(data)