Source code for dls_utilpack.describe
import json
from typing import Any
# ----------------------------------------------------------------------------------------
[docs]def describe(name, value: Any, level: int = 0) -> str:
"""
Compose a description of a variable's type and its value.
Args:
name: Name of the variable.
value: Value of the variable.
level: Indents output according to depth of recursion.
"""
value_type = "%s.%s" % (type(value).__module__, type(value).__name__)
if isinstance(value, dict):
try:
str_value = "\n" + json.dumps(value, indent=4)
except TypeError:
lines = []
prefix = "\n" + ("." * (level * 2))
# level += 1
for index, item in value.items():
lines.append(describe(f"{name}[{index}]", item, level))
str_value = "\n" + prefix.join(lines)
elif isinstance(value, list):
if len(value) == 0:
str_value = "length 0"
else:
try:
str_value = "\n" + json.dumps(value, indent=4)
except TypeError:
lines = []
prefix = "\n" + ("." * (level * 2))
# level += 1
for index, item in enumerate(value):
lines.append(describe(f"{name}[{index}]", item, level))
str_value = "\n" + prefix.join(lines)
elif isinstance(value, bytes):
str_value = "length %d" % (len(value))
elif value_type in ["CellExecutionError", "traitlets.config.loader.Config"]:
lines = []
prefix = "\n" + ("." * (level * 2))
# level += 1
for index, item in value.__dict__.items():
lines.append(describe(f"{name}[{index}]", item, level))
str_value = "\n" + prefix.join(lines)
else:
str_value = str(value)
return "%s is a %s %s" % (name, value_type, str_value)