Подтвердить что ты не робот

Лучший способ реализации пользовательских принтеров

Настройка pprint.PrettyPrinter

В документации для модуля pprint указано, что метод PrettyPrinter.format предназначен для настройки форматирования.

Я понимаю, что можно переопределить этот метод в подклассе, но это, похоже, не дает способа использовать методы базового класса для переноса строк и отступов.

  • Я что-то пропустил здесь?
  • Есть ли лучший способ сделать это (например, другой модуль)?

Альтернативы?

Я проверил модуль pretty, который выглядит интересным, но, похоже, не обеспечивает способ настройки форматирования классы из других модулей без изменения этих модулей.

Я думаю, что то, что я ищу, - это то, что позволит мне отображать типы (или, возможно, функции), которые идентифицируют типы для подпрограмм, обрабатывающих node. Подпрограммы, которые обрабатывают node, принимают node и возвращают строковое представление, вместе со списком дочерних узлов. И так далее.

Почему я смотрю на красивую печать

Моя конечная цель - компактно распечатать разделы, отформатированные в формате DocBook xml.etree.ElementTree.

(Я был удивлен, что не нашел больше поддержки Python для DocBook. Возможно, я что-то пропустил.)

Я создал некоторые базовые функции в клиенте под названием xmlearn, который использует lxml. Например, чтобы выгрузить файл Docbook, вы можете:

xmlearn -i docbook_file.xml dump -f docbook -r book

Это довольно наполовину задница, но мне досталась информация, которую я искал.

xmlearn имеет и другие функции, такие как возможность построения графического изображения и создания дампов, показывающих отношения между тегами в XML-документе, Они почти не связаны с этим вопросом.

Вы также можете выполнить дамп на произвольную глубину или указать XPath как набор начальных точек. Материал XPath вроде бы устарел на формат docbook, поэтому он не очень хорошо развит.

Это еще не ответ на вопрос. Я все еще надеюсь, что там где-то есть удобный настраиваемый принтер.

4b9b3361

Ответ 1

Этот вопрос может быть дубликатом:


Использование pprint.PrettyPrinter

Я просмотрел источник pprint. Кажется, что для повышения pprint() вам необходимо:

  • подкласс PrettyPrinter
  • override _format()
  • test для issubclass(),
  • и (если это не ваш класс), вернитесь к _format()

Alternative

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

Например:

'''Extending pprint'''

from pprint import pformat

class CrazyClass: pass

def prettyformat(obj):
    if isinstance(obj, CrazyClass):
        return "^CrazyFoSho^"
    else:
        return pformat(obj)

def prettyp(obj):
    print(prettyformat(obj))

# test
prettyp([1]*100)
prettyp(CrazyClass())

Большой потенциал здесь заключается в том, что вы не зависите от внутренних элементов pprint. Его явный и лаконичный характер.

Недостатком является то, что вы должны будете вручную выполнять отступы.

Ответ 2

Моим решением было заменить pprint.PrettyPrinter простой оболочкой, которая форматирует любые поплавки, которые она находит, прежде чем вызывать исходный принтер.

from __future__ import division
import pprint
if not hasattr(pprint,'old_printer'):
    pprint.old_printer=pprint.PrettyPrinter

class MyPrettyPrinter(pprint.old_printer):
    def _format(self,obj,*args,**kwargs):
        if isinstance(obj,float):
            obj=round(obj,4)
        return pprint.old_printer._format(self,obj,*args,**kwargs)
pprint.PrettyPrinter=MyPrettyPrinter

def pp(obj):
    pprint.pprint(obj)

if __name__=='__main__':
    x=[1,2,4,6,457,3,8,3,4]
    x=[_/17 for _ in x]
    pp(x)