Могу ли я сделать pprint в python3 не разбивать строки, как в python2?
Есть ли способ сказать pprint
в Python 3 не разбивать строки на пробел? Python 2 pprint
этого не делал. Можно ли отключить это поведение? Я просмотрел источник для pprint
, и он не выглядит там как вариант, который я видел для этого.
Можно как-нибудь обмануть?
Вот пример того, что я получаю:
>>> PP.pprint("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZ",width=-1,compact=True)
('ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ '
'ZZZZZ')
А вот что я хочу:
>>> PP.pprint("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZ",width=-1,compact=True)
('ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZ')
Чтобы уточнить, я хочу, чтобы он подчинялся ширине, а не строкам. Поэтому, когда я вижу, например:
PP.pprint(["ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZ","CATS"])
Я хочу:
['ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZ',
'CATS']
Не:
['ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ '
'ZZZZZZZZZZZZZ',
'CATS']
Ответы
Ответ 1
Вы можете просто установить для параметра width
действительно большое значение, например sys.maxsize
:
>>> import sys
>>> import pprint as PP
>>> PP.pprint("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZ",width=sys.maxsize,compact=True)
'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZ'
Настройка width
- -1
не имеет особого значения.
Единственным другим вариантом является подкласс класса PrettyPrinter()
и обертка метода _format()
:
import sys
from pprint import PrettyPrinter
class NoStringWrappingPrettyPrinter(PrettyPrinter):
def _format(self, object, *args):
if isinstance(object, str):
width = self._width
self._width = sys.maxsize
try:
super()._format(object, *args)
finally:
self._width = width
else:
super()._format(object, *args)
NoStringWrappingPrettyPrinter().pprint(yourobject)
Это устанавливает ширину в sys.maxsize
только для строк:
>>> NoStringWrappingPrettyPrinter().pprint(["ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZ", "CATS"])
['ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZ',
'CATS']
Ответ 2
Похоже, вам нужно установить ширину как длину вашей строки + 3 (для котировок с обеих сторон и новой строки) с абсолютным минимумом.
>>> x = 'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZ'
>>> PP.pprint(x, width=len(x))
'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ '
'ZZZZZ'
>>> PP.pprint(x, width=len(x) + 3)
'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZ'
Ответ 3
Другой подход, похожий на подход Мартина Питерса, но менее основанный на внутренностях pprint
, заключается в создании подкласса PrettyPrinter
и переопределении format
.
Внутри вы можете делегировать super().format
, но в результате вы можете подделать длину строк, чтобы они не были разделены. Это зависит от того, что выходной поток (например, sys.stdout
или StringIO()
) не смотрит на длину строки.
class Python2PrettyPrinter(pprint.PrettyPrinter):
class _fake_short_str(str):
def __len__(self):
return 1 if super().__len__() else 0
def format(self, object, context, maxlevels, level):
res = super().format(object, context, maxlevels, level)
if isinstance(object, str):
return (self._fake_short_str(res[0]), ) + res[1:]
return res
from io import StringIO
assert StringIO().write(_fake_short_str('_' * 1000)) == 1000
Python2PrettyPrinter().pprint(["TEST " * 20] * 2)
# ['TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST ',
# 'TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST ']
100% чистый способ - изменить поведение format
для всех поддерживаемых контейнерных классов и заменить каждую строку пользовательским объектом, имеющим такое же представление.