В настоящее время я использую следующий код для печати большой структуры данных
print(json.dumps(data, indent=4))
Я хотел бы видеть все целые числа, которые печатаются в шестнадцатеричном, а не в десятичном виде. Это возможно? Кажется, что нет способа переопределить существующий кодер для целых чисел. Вы можете предоставить значение по умолчанию только для типов, еще не обработанных классом JSONEncoder, но не можете переопределить способ кодирования целых чисел.
Я понял, что могу переопределить поведение целочисленной печати по умолчанию, используя sys.displayhook , если я работал в командной строке, но это не так.
Просто для справки, структура данных представляет собой набор из множества слов, списков, строк, целых чисел и т. Д. Вот почему я выбрал json.dumps () . Единственный другой способ сделать это - проанализировать его сам, и тогда я переписываю модуль json.
Обновление:
В итоге я реализовал его с сериализацией функций, которые просто распечатывают копию исходной структуры данных со всеми целочисленными типами, преобразованными в шестнадцатеричные строки:
def odprint(self, hexify=False):
"""pretty print the ordered dictionary"""
def hexify_list(data):
_data = []
for i,v in enumerate(data):
if isinstance(v, (int,long)):
_data.insert(i,hex(v))
elif isinstance(v,list):
_data.insert(i, hexify_list(v))
else:
_data.insert(i, val)
return _data
def hexify_dict(data):
_data = odict()
for k,v in data.items():
if isinstance(v, (dict,odict)):
_data[k] = hexify_dict(v)
elif isinstance(v, (int, long)):
_data[k] = hex(v)
elif isinstance(v,list):
_data[k] = hexify_list(v)
else:
_data[k] = v
return _data
if hexify:
print(json.dumps(hexify_dict(self), indent=4))
else:
print(json.dumps(self, indent=4))
Спасибо за помощь. Я понимаю, что в итоге я отказываюсь от стандартного диктанта, но это просто для печати, так что это прекрасно для того, что мне нужно.