python中具有可变参数的函数分派

python中具有可变参数的函数分派,python,dispatch,Python,Dispatch,我有许多以下类型的记录,它们的属性值是字符串 { "City": "Pune", "Temperature": "32", "Unit": "C", "Date": "22-11-2012" } 以及定义数据类型和其他属性属性的关联记录描述符 { "City": { "datatype": "string" }, "Temperature": { "datatype": "double" }, "Unit": { "datatype"

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

{
  "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"
  }
}
我需要将记录属性值从string转换为记录描述符中提到的适当数据类型

我有一本函数分派词典

{
   "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>>
{
“int”:字符串_到_int,
“double”:从字符串到双字符串,
“bool”:字符串到bool,
“datetime”:字符串\u到\u datetime
}
def字符串_到_int(值):
def字符串_到_双精度(值):
def字符串_到_bool(值):
定义字符串到日期时间(值、日期格式、时区):

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

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

type_to_function_map = {
   "int" : string_to_int,
   "double": string_to_double,
   "bool": string_to_bool,
   "datetime": string_to_datetime
}
您还可以将诸如
string\u 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
但话虽如此,还是有很多库可以做你想做得更好的事情。我个人最喜欢的是:

然后您可以这样使用:

MySchema().loads(data)

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

type_to_function_map = {
   "int" : string_to_int,
   "double": string_to_double,
   "bool": string_to_bool,
   "datetime": string_to_datetime
}
您还可以将诸如
string\u 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
但话虽如此,还是有很多库可以做你想做得更好的事情。我个人最喜欢的是:

然后您可以这样使用:

MySchema().loads(data)

你愿意使用像棉花糖这样的图书馆来解决这个问题吗?--你试过什么?您需要展示一些研究成果。至少,在dispatch dictionary中存储每个转换器函数的引用,而不是其名称<代码>{“int”:string_to_int,“double”:string_to_double,…}@chepner很抱歉,我在输入时犯了一个错误这似乎不是实际参数分派的好例子,因为您希望在返回类型上分派,而Python(可选)的静态键入系统不支持这一点(实际上很少有语言支持)。此外,在您的情况下,参数分派是一种过分的做法:您已经在不同的数据字段及其类型之间建立了一个定义良好的映射。您是否愿意使用像marshmallow这样的库来解决这个问题?--你试过什么?您需要展示一些研究成果。至少,在dispatch dictionary中存储每个转换器函数的引用,而不是其名称<代码>{“int”:string_to_int,“double”:string_to_double,…}@chepner很抱歉,我在输入时犯了一个错误这似乎不是实际参数分派的好例子,因为您希望在返回类型上分派,而Python(可选)的静态键入系统不支持这一点(实际上很少有语言支持)。此外,在您的例子中,参数分派是一种过分的做法:您已经在不同的数据字段及其类型之间有了一个定义良好的映射。