python 数据结构转换_Python中的双向数据结构转换

{das是基于这个λ}符号的:import datetime

converters = {

(str, datetime.date): lambda s: datetime.date(*map(int, s.split("."))),

(datetime.date, str): lambda d: d.strftime("%Y.%m.%d"),

}

mapping = [

('Person.name.first', str, 'Person.firstname', str),

('Person.name.last', str, 'Person.lastname', str),

('birth_date', str, 'Person.birth', datetime.date),

('points', str, 'Person.points', int),

]

def covert_doc(doc, mapping, converters, inverse=False):

converted = {}

for keys1, type1, keys2, type2 in mapping:

if inverse:

keys1, type1, keys2, type2 = keys2, type2, keys1, type1

converter = converters.get((type1, type2), type2)

keys1 = keys1.split('.')

keys2 = keys2.split('.')

obj1 = doc

while keys1:

k, *keys1 = keys1

obj1 = obj1[k]

dict2 = converted

while len(keys2) > 1:

k, *keys2 = keys2

dict2 = dict2.setdefault(k, {})

dict2[keys2[0]] = converter(obj1)

return converted

# Test

doc1 = {

"Person": {

"name": {

"first": "John",

"last": "Smith"

}

},

"birth_date": "1997.01.12",

"points": "330"

}

doc2 = {

"Person": {

"firstname": "John",

"lastname": "Smith",

"birth": datetime.date(1997, 1, 12),

"points": 330

}

}

assert doc2 == covert_doc(doc1, mapping, converters)

assert doc1 == covert_doc(doc2, mapping, converters, inverse=True)

这样做的好处是可以重用转换器(甚至可以转换不同的文档结构),而且只需要定义非平凡的转换。缺点是,事实上,每对类型都必须使用相同的转换(也许可以扩展它来添加可选的替代转换)。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值