2013-04-09 3 views
2

Я хочу использовать pprint для печати некоторых сложных списков, смотрите пример ниже:Использование pprint и пропуск типов имя

>>> x = [OrderedDict([(u'D-ID', u'clci-2'), (u'R', u'1691')]), OrderedDict([(u'D-ID', u'dallas-pcc-1'), (u'R', u'5498')]), OrderedDict([(u'D-ID', u'gx-1'), (u'R', u'2275')]), OrderedDict([(u'D-ID', u'gx-2'), (u'R', u'0')]), OrderedDict([(u'D-ID', u'ocs-1'), (u'R', u'31735')]), OrderedDict([(u'D-ID', u'ocs-2'), (u'R', u'0')]), OrderedDict([(u'D-ID', u'pcc-gx-1'), (u'R', u'46351')]), OrderedDict([(u'D-ID', u'rgx-1'), (u'R', u'907')]), OrderedDict([(u'D-ID', u'rgx-2'), (u'R', u'1010')]), OrderedDict([(u'D-ID', u'rocs-1'), (u'R', u'915')]), OrderedDict([(u'D-ID', u'rocs-2'), (u'R', u'1033')])] 
>>> pprint.pprint(x) 
[OrderedDict([(u'D-ID', u'clci-2'), (u'R', u'1691')]), 
OrderedDict([(u'D-ID', u'dallas-pcc-1'), (u'R', u'5498')]), 
OrderedDict([(u'D-ID', u'gx-1'), (u'R', u'2275')]), 
OrderedDict([(u'D-ID', u'gx-2'), (u'R', u'0')]), 
OrderedDict([(u'D-ID', u'ocs-1'), (u'R', u'31735')]), 
OrderedDict([(u'D-ID', u'ocs-2'), (u'R', u'0')]), 
OrderedDict([(u'D-ID', u'pcc-gx-1'), (u'R', u'46351')]), 
OrderedDict([(u'D-ID', u'rgx-1'), (u'R', u'907')]), 
OrderedDict([(u'D-ID', u'rgx-2'), (u'R', u'1010')]), 
OrderedDict([(u'D-ID', u'rocs-1'), (u'R', u'915')]), 
OrderedDict([(u'D-ID', u'rocs-2'), (u'R', u'1033')])] 

Это нормально, за исключением того, что я хочу, чтобы удалить все имя типа (OrderedDict & u) и все ненужно []. Возможно ли с помощью pprint?

+0

Зачем вам это нужно? – jamylak

+0

@jamylak Мне просто нужно распечатать структуры данных, такие как выше, и пропустить типы, а [] - отличный способ сделать вывод меньше! – theAlse

+0

Как насчет 'json.dumps'? – Boldewyn

ответ

2

Вы должны были бы создать свой собственный подкласс pprint.PrettyPrinter class, и переопределить метод .format():

from pprint import PrettyPrinter, _recursion 

class MyPrettyPrinter(PrettyPrinter): 
    def format(self, object, context, maxlevels, level): 
     if isinstance(object, OrderedDict): 
      if not object: 
       return "()", True, False 

      objid = id(object) 
      if maxlevels and level >= maxlevels: 
       return "(...)", False, objid in context 
      if objid in context: 
       return _recursion(object), False, True 
      context[objid] = 1 
      readable = True 
      recursive = False 
      components = [] 
      append = components.append 
      level += 1 
      selfformat = self.format 
      for k, v in sorted(object.items()): 
       krepr, kreadable, krecur = selfformat(k, context, maxlevels, level) 
       vrepr, vreadable, vrecur = selfformat(v, context, maxlevels, level) 
       append('({}, {})'.format(krepr, vrepr)) 
       readable = readable and kreadable and vreadable 
       if krecur or vrecur: 
        recursive = True 
      del context[objid] 
      return '({})'.format(', '.join(components)), readable, recursive 

     formatted, readable, recursion = PrettyPrinter.format(self, object, context, maxlevels, level) 
     if isinstance(object, unicode): 
      formatted = formatted.lstrip('u') 

     return formatted, readable, recursion 

Мы разрешаем базовому классу выполнять большую часть работы и явно форматируем только OrderedDict; он имеет пользовательский __repr__, что означает, что реализация pprint использует это вместо того, чтобы рекурсивно над ним.

Затем использовать этот класс вместо прямых вызовов pprint.pprint():

mypprint = MyPrettyPrinter() 

mypprint.pprint(x) 

Это дает:

>>> mypprint = MyPrettyPrinter() 
>>> mypprint.pprint(x) 
[(('D-ID', 'clci-2'), ('R', '1691')), 
(('D-ID', 'dallas-pcc-1'), ('R', '5498')), 
(('D-ID', 'gx-1'), ('R', '2275')), 
(('D-ID', 'gx-2'), ('R', '0')), 
(('D-ID', 'ocs-1'), ('R', '31735')), 
(('D-ID', 'ocs-2'), ('R', '0')), 
(('D-ID', 'pcc-gx-1'), ('R', '46351')), 
(('D-ID', 'rgx-1'), ('R', '907')), 
(('D-ID', 'rgx-2'), ('R', '1010')), 
(('D-ID', 'rocs-1'), ('R', '915')), 
(('D-ID', 'rocs-2'), ('R', '1033'))] 
+0

Мне нравится идея, но я не думаю, что это заберет «внутренние» строки юникода, как показано на вашем выходе. – DSM

+0

@ DSM: Урм, он не рекурсировал. Проклятия, поэтому нам нужно перезаписать себя, обновить. –

+0

@ DSM: лучше; потому что пользовательский '__repr__' pprint просто использовал бы это вместо того, чтобы пересказывать его. –

0
>>> import pprint 
>>> from collections import OrderedDict 
>>> x = [OrderedDict([(u'D-ID', u'clci-2'), (u'R', u'1691')]), OrderedDict([(u'D-ID', u'dallas-pcc-1'), (u'R', u'5498')]), OrderedDict([(u'D-ID', u'gx-1'), (u'R', u'2275')]), OrderedDict([(u'D-ID', u'gx-2'), (u'R', u'0')]), OrderedDict([(u'D-ID', u'ocs-1'), (u'R', u'31735')]), OrderedDict([(u'D-ID', u'ocs-2'), (u'R', u'0')]), OrderedDict([(u'D-ID', u'pcc-gx-1'), (u'R', u'46351')]), OrderedDict([(u'D-ID', u'rgx-1'), (u'R', u'907')]), OrderedDict([(u'D-ID', u'rgx-2'), (u'R', u'1010')]), OrderedDict([(u'D-ID', u'rocs-1'), (u'R', u'915')]), OrderedDict([(u'D-ID', u'rocs-2'), (u'R', u'1033')])] 
>>> print pprint.pformat(x).replace("OrderedDict([", "(") \ 
          .replace("u'", "'") \ 
          .replace("])", ")") 

[(('D-ID', 'clci-2'), ('R', '1691')), 
(('D-ID', 'dallas-pcc-1'), ('R', '5498')), 
(('D-ID', 'gx-1'), ('R', '2275')), 
(('D-ID', 'gx-2'), ('R', '0')), 
(('D-ID', 'ocs-1'), ('R', '31735')), 
(('D-ID', 'ocs-2'), ('R', '0')), 
(('D-ID', 'pcc-gx-1'), ('R', '46351')), 
(('D-ID', 'rgx-1'), ('R', '907')), 
(('D-ID', 'rgx-2'), ('R', '1010')), 
(('D-ID', 'rocs-1'), ('R', '915')), 
(('D-ID', 'rocs-2'), ('R', '1033'))] 

Отрегулируйте replace с для ваших потребностей, я думаю, что это выглядит достаточно чистым

0

Если это только для печати некоторых dict и list материала (или материала из классов, наследующих от них), вам было бы лучше использовать какую-либо другую сериализацию, например JSON:

+0

С 'indent = 0' для новых строк – jamylak

+0

Я использовал json.dumps для других dicts, выход, к сожалению, уродливее, чем pprint. – theAlse