Лучший способ напечатать dict с символами \ n или \ t в ключах или значения в Python? - PullRequest
0 голосов
/ 02 сентября 2018

По сути, я хочу напечатать словарь так, чтобы он использовал str() вместо repr() для строкового преобразования его ключей и значений.

Это было бы особенно полезно при сохранении строки трассировки в некоторых json. Но это выглядит намного сложнее, чем я себе представляю:

In [1]: import pprint, json

In [2]: example = {'a\tb': '\nthis\tis\nsome\ttext\n'}

In [3]: print(example)
{'a\tb': '\nthis\tis\nsome\ttext\n'}

In [4]: str(example)
Out[4]: "{'a\\tb': '\\nthis\\tis\\nsome\\ttext\\n'}"

In [5]: pprint.pprint(example)
{'a\tb': '\nthis\tis\nsome\ttext\n'}

In [6]: pprint.pformat(example)
Out[6]: "{'a\\tb': '\\nthis\\tis\\nsome\\ttext\\n'}"

In [7]: json.dumps(example, indent=2)
Out[7]: '{\n  "a\\tb": "\\nthis\\tis\\nsome\\ttext\\n"\n}'

In [8]: print(json.dumps(example, indent=2))
{
  "a\tb": "\nthis\tis\nsome\ttext\n"
}

Я хочу (и ожидаю) такое поведение:

> print(d)
{'a    b': '
this    is
some    text
'}

> pprint.pprint(d)
{
  'a    b': '
this    is
some    text
'
}

или, может быть, если pprint действительно умный:

> pprint.pprint(d)
{
  'a    b': '
  this    is
  some    text
  '
}

... но я не могу встроить способ сделать это!

Я хотел бы знать, каков стандартный / лучший способ сделать это, и если его нет, почему бы и нет? Есть ли особая причина, по которой repr() всегда вызывается для строк вместо str() при печати диктовок (и других контейнеров)?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

более общий ответ:

def myPrint(txt)
    print(bytes(str(txt), 'utf-8').decode("unicode_escape"))

myPrint(example)

{'a b': '
this    is
some    text
'}

Игра с этим немного больше:

ПРИМЕЧАНИЕ Обычно плохая идея перезаписывать встроенные модули, и это может вызвать другие проблемы, но .......

import builtins

def print(*args, literal = False):
        if literal:
            builtins.print(bytes(str(" ".join([str(ag) for ag in args])), 'utf-8').decode("unicode_escape"))
        else:
            builtins.print(*args)

print(example, literal = True)
{'a b': '
this    is
some    text
'}

print(example)
{'a\tb': '\nthis\tis\nsome\ttext\n'}

print(example, literal = False)
{'a\tb': '\nthis\tis\nsome\ttext\n'}
0 голосов
/ 02 сентября 2018

Вы можете сделать это более общим, но оно будет работать для \n и \t как

example = {'a\tb': '\nthis\tis\nsome\ttext\n'}

def myPrint(txt):
    txt = str(txt)
    swaps = [("\\n", "\n"),
             ("\\t", "\t")]
    for swap in swaps:
        txt= txt.replace(swap[0], swap[1])
    print(txt)

myPrint(example)

{'a b': '
this    is
some    text
'}
...