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(可选)的静态键入系统不支持这一点(实际上很少有语言支持)。此外,在您的例子中,参数分派是一种过分的做法:您已经在不同的数据字段及其类型之间有了一个定义良好的映射。