我认为如果将转换放在开头,允许递归调用传递
ObjectId
并将转换后的字符串直接与函数一起返回,而不是尝试在函数的循环内进行转换。然后您可以将该值传递到递归中,并将字符串取回。
类似于:
from datetime import datetime
def clean_dict_helper(d):
if isinstance(d, ObjectId) or isinstance(d, datetime):
return str(d)
if isinstance(d, list): # For those db functions which return list
return [clean_dict_helper(x) for x in d]
if isinstance(d, dict):
for k, v in d.items():
d.update({k: clean_dict_helper(v)})
# return anything else, like a string or number
return d
打电话:
clean_dict_helper({
1: {
1: ObjectId('5e0e83a6d0fbe7238c960ea0'),
2: [ObjectId('5e0e83a6d0fbe7238c960ea0'), ObjectId('5e0e83a6d0fbe7238c960ea0')],
3: datetime(2020, 1, 1),
4: [{1: ObjectId('5e0e83a6d0fbe7238c960ea0')}],
5: 'test'
},
2: [ObjectId('5e0e83a6d0fbe7238c960ea0'), ObjectId('5e0e83a6d0fbe7238c960ea0')]
})
然后将返回:
{1: {1: '5e0e83a6d0fbe7238c960ea0',
2: ['5e0e83a6d0fbe7238c960ea0', '5e0e83a6d0fbe7238c960ea0'],
3: '2020-01-01 00:00:00',
4: [{1: '5e0e83a6d0fbe7238c960ea0'}],
5: 'test'},
2: ['5e0e83a6d0fbe7238c960ea0', '5e0e83a6d0fbe7238c960ea0']}
另外,由于您正在创建一个具有理解力的新列表,因此返回一个新的dict可能是有意义的,而不是用如下内容对传入值进行变异:
if isinstance(d, dict):
return {k:clean_dict_helper(v) for k, v in d.items() }