Skip to content

Instantly share code, notes, and snippets.

@latant
Created August 14, 2020 14:54
Show Gist options
  • Save latant/8243254b6842dd8e416c67c11bf4875f to your computer and use it in GitHub Desktop.
Save latant/8243254b6842dd8e416c67c11bf4875f to your computer and use it in GitHub Desktop.
Pretty string printer for nested, circular data structures.
class PrettyStringCreation:
def pstr_list(self, l: list, opts: dict):
plist = []
for e in l:
plist.append(self.pstr(e, opts))
return '[' + ', '.join(plist) + ']'
def pstr_dict(self, d: dict, opts: dict):
sl = []
for k in d.keys():
if k in set(opts.keys()):
sl.append(self.pstr(k) + ': ' + self.pstr(d[k], opts[k]))
else:
sl.append(self.pstr(k) + ': ' + self.pstr(d[k]))
return '{' + ', '.join(sl) + '}'
def pstr_other(self, obj, opts: dict):
d: dict = obj.__dict__
if type(opts) == str:
return d[opts]
sl = []
for k in d.keys():
if k in set(opts.keys()):
v = d[k]
if type(v) == dict:
sl.append(self.pstr(k) + ': ' + self.pstr(v, opts[k]))
elif type(v) == list:
l = []
for e in v:
l.append(self.pstr(e, opts[k]))
sl.append(self.pstr(k) + ': ' + '[' + ', '.join(l) + ']')
else:
sl.append(self.pstr(k) + ': ' + self.pstr(v, opts[k]))
else:
sl.append(self.pstr(k) + ': ' + self.pstr(d[k]))
return obj.__class__.__name__ + '(' + ', '.join(sl) + ')'
def pstr(self, obj, opts=None) -> str:
if opts is None:
opts = {}
t = type(obj)
if obj is None:
return "None"
elif t == int:
return obj.__str__()
elif t == float:
return obj.__str__()
elif t == str:
return obj.__str__()
elif t == list:
return self.pstr_list(obj, opts)
elif t == dict:
return self.pstr_dict(obj, opts)
else:
return self.pstr_other(obj, opts)
def pretty_print(obj, **kwargs):
print(PrettyStringCreation().pstr(obj, kwargs))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment