def normalize(self):
params = pimms.imm_params(self)<EOL>if '<STR_LIT>' in params:<EOL><INDENT>md = dict(params['<STR_LIT>'])<EOL>del params['<STR_LIT>']<EOL>params = normalize(params)<EOL>for k in list(md.keys()):<EOL><INDENT>if not pimms.is_str(k):<EOL><INDENT>del md[k]<EOL>continue<EOL><DEDENT>try: md[k] = normalize(md[k])<EOL>except Exception: del md[k]<EOL><DEDENT>params['<STR_LIT>'] = md<EOL><DEDENT>else: params = normalize(params)<EOL>return params<EOL>
obj.normalize() yields a JSON-friendly Python native data-structure (i.e., dicts, lists,
  strings, numbers) that represents the given object obj. If obj contains data that cannot
  be represented in a normalized format, raises an error.

Note that if the object's meta_data cannot be encoded, then any part of the meta_data that
fails is simply excluded from the normalized representation.

This function generally shouldn't be called directly unless you plan to call
<class>.denormalize(data) directly as well--rather, use normalize(obj) and
denormalize(data). These latter calls ensure that the type information necessary to deduce
the proper class's denormalize function is embedded in the data.