2017-06-04 9 views
3

私はタプルキーで入れ子構造の辞書構造を持っています。ここで私はPPRINTを使用して辞書をかなり-印刷するとき、エントリは次のようになります。カスタムフロートフォーマットのpprint

... 
('A', 'B'): {'C': 0.14285714285714285, 
       'D': 0.14285714285714285, 
       'E': 0.14285714285714285, 
       'F': 0.14285714285714285, 
       'G': 0.14285714285714285, 
       'H': 0.14285714285714285, 
       'I': 0.14285714285714285}, 
... 

それはかなり気の利いたのですが、私は山車からいくつかの余分な数字を切り下げることで、さらにそれをカスタマイズしたいと思います。私はpprint.PrettyPrintをサブクラス化することによって達成することが可能だと考えていたが、どうやってそれを行うのか分からない。

ありがとうございました。

答えて

2

あなたが言ったように、PrettyPrinterをサブクラス化し、formatメソッドを上書きすることで、これを実現できます。出力はフォーマットされた文字列だけでなく、いくつかのフラグでもあることに注意してください。

あなたはそれをしているならば、あなたもこれを一般化し、コンストラクタにさまざまな種類のために所望の形式で辞書を渡すことができます。

class FormatPrinter(pprint.PrettyPrinter): 

    def __init__(self, formats): 
     super(FormatPrinter, self).__init__() 
     self.formats = formats 

    def format(self, obj, ctx, maxlvl, lvl): 
     if type(obj) in self.formats: 
      return self.formats[type(obj)] % obj, 1, 0 
     return pprint.PrettyPrinter.format(self, obj, ctx, maxlvl, lvl) 

例:

>>> d = {('A', 'B'): {'C': 0.14285714285714285, 
...     'D': 0.14285714285714285, 
...     'E': 0.14285714285714285}, 
...  'C': 255} 
... 
>>> FormatPrinter({float: "%.2f", int: "%06X"}).pprint(d) 
{'C': 0000FF, 
('A', 'B'): {'C': 0.14, 
       'D': 0.14, 
       'E': 0.14}} 
+1

何スーパー 'について(FormatPrinter、self) 'の代わりに' pprint.PrettyPrinter'を使用していますか? –

+2

一般的な書式設定機能を使用したいと思うかもしれません。したがって、 'FormatPrinter({float: '{0:.2f}'。format})'を返し、 'self.formats [type(obj)](obj)'を返します。 – Artyer

+0

@Artyerはい、それも可能です。書式文字列を渡すだけでなく、もう少し冗長にするよりも多目的である可能性があります。 –

関連する問題