24

カスタマイズpprint.PrettyPrinter

pprintモジュールのドキュメントには、このメソッドPrettyPrinter.formatが書式設定のカスタマイズを可能にすることを目的としていることが記載されています。

サブクラスでこのメソッドをオーバーライドすることは可能だと思いますが、基本クラスのメソッドに行の折り返しとインデントを適用させる方法は提供されていないようです。

  • ここで何か不足していますか?
  • これを行うためのより良い方法はありますか (別のモジュールなど)?

代替案?

モジュールをチェックアウトしましたがpretty、これは興味深いようですが、それらのモジュールを変更せずに他のモジュールからクラスのフォーマットをカスタマイズする方法を提供していないようです。

私が探しているのは、ノードを処理するルーチンへの型を識別する型 (または関数) のマッピングを提供できるようにするものだと思います。ノードを処理するルーチンは、ノードを受け取り、その文字列表現を子ノードのリストとともに返します。等々。

私がプリティプリンティングを検討している理由

私の最終的な目標は、DocBook 形式の のカスタム形式のセクションをコンパクトに印刷することですxml.etree.ElementTree

(DocBook の Python サポートがこれ以上見つからないことに驚きました。何か見落としていたのかもしれません。)

lxmlを使用するxmlearnというクライアントにいくつかの基本機能を組み込みました。たとえば、Docbook ファイルをダンプするには、次のようにします。

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

かなり中途半端ですが、探していた情報が得られました。

xmlearnには、グラフ イメージを作成したり、XML ドキュメント内のタグ間の関係を示すダンプを作成したりする機能など、他の機能もあります。これらは、この質問とはまったく関係ありません。

任意の深さまでダンプを実行したり、開始点のセットとして XPath を指定したりすることもできます。XPath のようなものは、docbook 固有のフォーマットを時代遅れにしたため、あまり開発されていません。

これはまだ質問に対する答えではありません。すぐにカスタマイズできるきれいなプリンターがどこかにあることを私はまだ望んでいます.

4

4 に答える 4

3

私の解決策は、 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)
于 2013-03-14T18:46:34.377 に答える
2

この質問は次のものと重複している可能性があります。


使用するpprint.PrettyPrinter

pprintのソースを調べました。を強化するには、次pprint()のことが必要であることを示唆しているようです。

  • サブクラスPrettyPrinter
  • オーバーライド_format()
  • のテストissubclass()
  • そして(それがあなたのクラスでない場合)、に戻ります_format()

より良いアプローチは、何が起きているのかわからないときに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ここでの大きな利点は、内部に依存しないことです。それは明示的かつ簡潔です。

欠点は、インデントを手動で処理する必要があることです。

于 2011-04-26T14:33:52.077 に答える
1

prettyモジュールの使用を検討してください。

于 2012-07-27T19:17:46.077 に答える