from .base import PipelineStep
[docs]class FlattenStep(PipelineStep):
"""
Convert nested dicts to flat dicts.
:param int depth: Number of nested levels to flatten. Set to -1 for infinite depth.
**Examples**:
Input::
{
'fields': {
'name': {
'de': 'Deutsch',
'en': 'English',
},
},
}
Output::
{
'fields.name.de': 'Deutsch',
'fields.name.en': 'English',
}
"""
def __init__(self, depth=-1):
self.depth = depth
def flatten(self, dct, level=0):
"""Flatten a dict."""
for key, value in dct.items():
if isinstance(value, dict) and (level < self.depth or self.depth < 0):
for subkey, subvalue in self.flatten(value, level=level + 1):
yield key + '.' + subkey, subvalue
else:
yield key, value
def map(self, state):
for dataset in state:
yield dataset.__class__(self.flatten(dataset))
def process_step(self, state, context):
state = self.map(state)
return state, context