1

私は Google App Engine 環境のUserオブジェクトを使用しており、次のことを試してみました。

pprint(user)
print vars(user)

結果:

pprint(ユーザー)

users.User(email='test@example.com',_user_id='18580000000000')

出力変数 (ユーザー)

{'_User__federated_identity': None, '_User__auth_domain': 'gmail.com',
'_User__email': 'test@example.com', '_User__user_id': '1858000000000',
'_User__federated_provider': None}

ここにいくつかの問題があります(マルチパートで申し訳ありません):

  1. オブジェクトにすべての変数が表示されないのはなぜですか。表示されていませんauth_domain。値はどれですか?
  2. = None であるプロパティをリストする方法はありますか? None は正当な値ですが、これらのプロパティが存在しないように扱われるのはなぜですか?
  3. プロパティ間で pprint を改行する方法はありますか?
4

3 に答える 3

5

pprintインスタンスreprvars_ __dict___ 次に例を示します。

>>> class Foo(object):
...     def __init__(self, a, b):
...             self.a = a
...             self.b = b
...     def __repr__(self):
...             return 'Foo(a=%s)' % self.a
...
>>> f = Foo(a=1, b=2)
>>> vars(f)
{'a': 1, 'b': 2}
>>> pprint.pprint(f)
Foo(a=1)
>>> vars(f) is f.__dict__
True

__repr__ここでの特別なメソッド( pprint()printステートメント、repr()、およびその他によって呼び出される) にはメンバーのみが明示的に含まれていることがわかりますがa、インスタンスには と の__dict__両方が含まれてaおりb、 によって返される辞書に反映されていvars()ます。

于 2011-11-17T14:30:29.153 に答える
3

この種のオブジェクトの印刷ダンプで異なる改行を取得するには、いくつかの方法があります。

サンプルデータ:

d = dict(a=1, b=2, c=dict(d=3, e=[4, 5, 6], f=dict(g=7)), h=[8,9,10])

フレンドリな間隔のない標準的な印刷:

>>> print d
{'a': 1, 'h': [8, 9, 10], 'c': {'e': [4, 5, 6], 'd': 3, 'f': {'g': 7}}, 'b': 2}

考えられる解決策は次の 2 つです。

(1) pprintwithwidth=1を使用すると、1 行あたり 1 つのリーフ ノードが得られますが、1 行あたり >1 キーになる可能性があります。

>>> import pprint
>>> pprint.pprint(d, width=1)
{'a': 1,
 'b': 2,
 'c': {'d': 3,
       'e': [4,
             5,
             6],
       'f': {'g': 7}},
 'h': [8,
       9,
       10]}

(2) を使用json.dumpsすると、行ごとに最大 1 つのキーが得られますが、一部の行には閉じ括弧だけがあります。

>>> import json
>>> print json.dumps(d, indent=4)
{
    "a": 1, 
    "h": [
        8, 
        9, 
        10
    ], 
    "c": {
        "e": [
            4, 
            5, 
            6
        ], 
        "d": 3, 
        "f": {
            "g": 7
        }
    }, 
    "b": 2
}
于 2014-03-27T20:22:39.330 に答える
1

質問3「プロパティ間でpprintを改行する方法はありますか?」を参照してください。

PythonDocsは次のように説明しています。

フォーマットされた表現は、可能であればオブジェクトを1行に保持し、許可された幅内に収まらない場合は複数の行に分割します。

プロパティ「width」(initで合格)は、許容されるものを指定する場所です。私はwidth=1に設定しましたが、それでうまくいくようです。

例として:

pretty = pprint.PrettyPrinter(indent=2)

結果は...

{ 'acbdf': { 'abdf': { 'c': { }}, 'cbdf': { 'bdf': { 'c': { }}, 'cbd': { }}},
  'cef': { 'abd': { }}}

一方

pretty = pprint.PrettyPrinter(indent=2,width=1)

結果は...

{ 'acbdf': { 'abdf': { 'c': { }},
             'cbdf': { 'bdf': { 'c': { }},
                       'cbd': { }}},
  'cef': { 'abd': { }}}

お役に立てば幸いです。

于 2012-06-07T22:26:00.290 に答える