2016-02-13 2 views
2

Можно ли изменить красивый принтер, который использует IPython?Можно ли изменить красивый принтер IPython?

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

In [42]: {"foo": [{"bar": 42}, {"bar": 16}] * 3, "bar": [1,2,3,4,5]} 
Out[42]: 
{'bar': [1, 2, 3, 4, 5], 
'foo': [{'bar': 42}, 
    {'bar': 16}, 
    {'bar': 42}, 
    {'bar': 16}, 
    {'bar': 42}, 
    {'bar': 16}]} 

In [43]: pprintpp.pprint({"foo": [{"bar": 42}, {"bar": 16}] * 5, "bar": [1,2,3,4,5]}) 
{ 
    'bar': [1, 2, 3, 4, 5], 
    'foo': [ 
     {'bar': 42}, 
     {'bar': 16}, 
     {'bar': 42}, 
     {'bar': 16}, 
     {'bar': 42}, 
     {'bar': 16}, 
     {'bar': 42}, 
     {'bar': 16}, 
     {'bar': 42}, 
     {'bar': 16}, 
    ], 
} 
+0

Там был билет открыт для функции здесь: https://github.com/ipython/ipython/issues/9227 –

ответ

4

Это технически может быть сделано с помощью обезьяны-заплат класса IPython.lib.pretty.RepresentationPrinter используется here в IPython ,

Это, как можно это сделать:

In [1]: o = {"foo": [{"bar": 42}, {"bar": 16}] * 3, "bar": [1,2,3,4,5]} 

In [2]: o 
Out[2]: 
{'bar': [1, 2, 3, 4, 5], 
'foo': [{'bar': 42}, 
    {'bar': 16}, 
    {'bar': 42}, 
    {'bar': 16}, 
    {'bar': 42}, 
    {'bar': 16}]} 

In [3]: import IPython.lib.pretty 

In [4]: import pprintpp 

In [5]: class NewRepresentationPrinter: 
      def __init__(self, stream, *args, **kwargs): 
       self.stream = stream 
      def pretty(self, obj): 
       p = pprintpp.pformat(obj) 
       self.stream.write(p.rstrip()) 
      def flush(self): 
       pass 


In [6]: IPython.lib.pretty.RepresentationPrinter = NewRepresentationPrinter 

In [7]: o 
Out[7]: 
{ 
    'bar': [1, 2, 3, 4, 5], 
    'foo': [ 
     {'bar': 42}, 
     {'bar': 16}, 
     {'bar': 42}, 
     {'bar': 16}, 
     {'bar': 42}, 
     {'bar': 16}, 
    ], 
} 

Это плохая идея для множества причин, но должны технически работать в настоящее время. В настоящее время, похоже, нет официального, поддерживаемого способа переопределить всю красивую печать в IPython, по крайней мере, просто.

(примечание: .rstrip() необходима потому, что IPython не ожидает завершающую новой строки на результат)

+0

Мне нравятся плохие идеи! В мой 'ipy_user_conf.py' это происходит. Благодаря! –