web-dev-qa-db-ja.com

pprintを使用して、組み込みの__str __(self)メソッドを使用してオブジェクトを印刷するにはどうすればよいですか?

レポートの使用情報を含む.txtファイルを処理するPythonスクリプトがあります。pprintのpprint(vars(object))を使用してオブジェクトの属性をきれいに印刷する方法を見つけたいと思います。 ) 関数。

スクリプトはファイルを読み取り、Reportクラスのインスタンスを作成します。これがクラスです。

class Report(object):
    def __init__(self, line, headers):
        self.date_added=get_column_by_header(line,headers,"Date Added")
        self.user=get_column_by_header(line,headers,"Login ID")
        self.report=get_column_by_header(line,headers,"Search/Report Description")
        self.price=get_column_by_header(line,headers,"Price")
        self.retail_price=get_column_by_header(line,headers,"Retail Price")

    def __str__(self):
        from pprint import pprint
        return str(pprint(vars(self)))

Reportのインスタンスをきれいにa-la-pprintで印刷できるようにしたいと思います。

for i,line in enumerate(open(path+file_1,'r')):
    line=line.strip().split("|")
    if i==0:
        headers=line

    if i==1:
        record=Report(line,headers)
        print record

私が電話するとき

print record

レポートの単一インスタンスの場合、これは私がシェルで取得するものです。

{'date_added': '1/3/2012 14:06',
'price': '0',
'report': 'some_report',
'retail_price': '0.25',
'user': 'some_username'}
 None

私の質問は2つあります。

まず、これはオブジェクトの属性をきれいに印刷するための良い/望ましい方法ですか? pprintの有無にかかわらずこれを行うためのより良い方法はありますか?

第二に、なぜですか

None

最後にシェルに印刷しますか?私はそれがどこから来ているのか混乱しています。

ヒントをありがとう。

13
hernamesbarbara

pprintは単なる別の形式の印刷です。 pprint(vars(self))と言うと、varsをstdoutに出力し、void関数であるためnoneを返します。したがって、文字列にキャストすると、Nonepprintによって返される)が文字列に変換され、最初のprintステートメントから出力されます。印刷をpprintに変更するか、印刷をすべて使用する場合は印刷として再定義することをお勧めします。

def __str__(self):
    from pprint import pprint
    return str(vars(self))

for i,line in enumerate(open(path+file_1,'r')):
    line = line.strip().split("|")
    if i == 0:
        headers = line
    if i == 1:
        record = Report(line,headers)
        pprint record

1つの代替方法は、フォーマットされた出力を使用することです。

def __str__(self):
    return "date added:   %s\nPrice:        %s\nReport:       %s\nretail price: %s\nuser:         %s" % Tuple([str(i) for i in vars(self).values()])

これがお役に立てば幸いです

5
Dan

ダンの解決策は間違っており、イスマイルは不完全です。

  1. __str__()は呼び出されず、__repr__()が呼び出されます。
  2. __repr__()は、pformatと同様に、文字列を返す必要があります。
  3. printは通常、1文字だけインデントし、行を保存しようとします。構造を理解しようとしている場合は、幅を低く設定し、インデントを高く設定します。

これが例です

class S:
    def __repr__(self):
        from pprint import pformat
        return pformat(vars(self), indent=4, width=1)

a = S()
a.b = 'bee'
a.c = {'cats': ['blacky', 'tiger'], 'dogs': ['rex', 'king'] }
a.d = S()
a.d.more_c = a.c

print(a)

このプリント

{   'b': 'bee',
    'c': {   'cats': [   'blacky',
                         'tiger'],
             'dogs': [   'rex',
                         'king']},
    'd': {   'more_c': {   'cats': [   'blacky',
                               'tiger'],
                  'dogs': [   'rex',
                              'king']}}}

これは完璧ではありませんが、まずまずです。

20
Charles Merriam

_pprint.pprint_は文字列を返しません。実際に印刷を行います(デフォルトではstdoutですが、出力ストリームを指定できます)。したがって、_print record_を記述すると、record.__str__()が呼び出され、pprintが呼び出され、Noneが返されます。 str(None)は_'None'_であり、それはprintedを取得します。そのため、Noneが表示されます。

代わりに _pprint.pformat_ を使用する必要があります。 (または、StringIOインスタンスをpprintに渡すこともできます。)

12
Ismail Badawi

他のオブジェクトなどを含むプリティプリントオブジェクトの場合。pprintでは不十分です。 IPythonのlib.pretty を試してください。これは、Rubyモジュールに基づいています。

from IPython.lib.pretty import pprint
pprint(complex_object)
3
cdunn2001

beeprint が必要だと思います。

ただpip install beeprintそしてコードを次のように変更します。

def __str__(self):
    from beeprint import pp
    return pp(self, output=False)
3
Anyany Pan