2017-02-08 7 views
1

varsでPythonオブジェクトの属性を表示する方法はありますか?出力フォーマットはクリーンであり、各属性のすべての値を表示していませんか? (たとえば、大規模な配列がすべての画面を占めている)。基本的には、その属性のクリーンなリストがほしいだけです。あなたは、オブジェクトのvarsのキーのリストが必要な場合vars()の出力をきちんと解析するには?

+1

標準の 'pprint'を試しましたか? – jonrsharpe

+0

ipthon '%whos'の表示は素晴らしいですが、' vars() 'のような辞書でそれを呼び出す方法はありません。 – hpaulj

+0

@hpaulj ipython%whos? ... – Spacey

答えて

3

、それは

list(vars(whatever)) 

だろうか、あなたは自分のライン上にキーを通過し、印刷することができます:

for attr in vars(whatever): 
    print(attr) 

あなたはpprint(IPythonのデフォルトのきれいな印刷よりも美しくないかもしれませんが)でその辞書をきれいに印刷することができます:

import pprint 
pprint.pprint(vars(whatever)) 

か、あなたが考えている情報をコード化して、情報を見るための読みやすい方法となるでしょう。varsがあなたに与えます。あなたはいつも自由に独自のコードを書くことができます。

また、dir(whatever)もあります。これは、インタラクティブな検査に役立つオブジェクトの属性のリストを提供することを目的としています。 dir(whatever)は、通常、list(vars(whatever))とは異なります。たとえば、メソッドが含まれます。

1

属性名のリスト、varskeysが必要ですか?または、完全な辞書keysvalues?オブジェクトクラスによっては、空でも、少数のスカラーや文字列、リストや配列などの大規模で複雑なセットでもかまいません。汎用的な「pretty-printer」がなければ、すべてのクラスに対して明確な表示を生成することはできません。オブジェクト属性の有用な表示を生成するのは、__str____repr__メソッドの目的です。私の現在のipythonセッションで

変数は次のとおりです。

In [97]: who 
M argparse arr  b choices  forbool  np nr parser 
product sparse sys  

一つは、空のVARS

In [99]: forbool 
Out[99]: <function __main__.forbool> 

In [100]: vars(forbool) 
Out[100]: {} 

一つとユーザー定義関数は、適度な数で、スパース行列であります属性。この例では5つの非ゼロ値しかないので、配列はかなり小さいです。はい、数が少ない配列は非常に大きくなる可能性があります。それらの表示はnumpyコードによって制御されます。

In [101]: M 
Out[101]: 
<5x5 sparse matrix of type '<class 'numpy.float64'>' 
    with 5 stored elements in LInked List format> 

In [102]: vars(M) 
Out[102]: 
{'_shape': (5, 5), 
'data': array([[1.0], [1.0], [1.0], [1.0], [1.0]], dtype=object), 
'dtype': dtype('float64'), 
'maxprint': 50, 
'rows': array([[0], [1], [2], [3], [4]], dtype=object)} 

​​は多くのvarsを持つインポートされたモジュールです。 1つは、docがほぼ1ページ分を占めています。

In [103]: len(vars(argparse)) 
Out[103]: 52 

arr配列で、__dict__を持っていない、とvars(arr)はエラーになります。

これは、このディスプレイのwhosディスプレイです。アレイは、ipythonに固有の凝縮された形式で表示されます。

In [108]: %whos 
Variable Type    Data/Info 
-------------------------------------- 
M   lil_matrix   (0, 0) 1.0\n (1, 1) 1.<...> (3, 3) 1.0\n (4, 4) 1.0 
argparse module   <module 'argparse' from '<...>b/python3.5/argparse.py'> 
arr  ndarray   10x3: 30 elems, type `int32`, 120 bytes 
b   ndarray   4x2: 8 elems, type `int32`, 32 bytes 
choices list    n=16 
forbool function   <function forbool at 0xb52950bc> 
np   module   <module 'numpy' from '/us<...>kages/numpy/__init__.py'> 
nr   int    3 
parser  ArgumentParser ArgumentParser(prog='ipyt<...>r='error', add_help=True) 
product type    <class 'itertools.product'> 
sparse  module   <module 'scipy.sparse' fr<...>cipy/sparse/__init__.py'> 
sys  module   <module 'sys' (built-in)> 

かなりのプリンタを書くことができます。ここでスタートだ:疎行列の場合

def pprt(var): 
    for k,v in vars(var).items(): 
     if isinstance(v, np.ndarray): 
      astr = 'array {},{}'.format(v.dtype, v.shape) 
     if isinstance(v, (list, tuple, dict)): 
      if len(v)>10: 
       astr = 'big '+type(v) 
      else: 
       astr = str(v) 
     elif isinstance(v, str): 
      astr = v[:20] 
     else: 
      astr = str(v) 
     print(k,':',astr) 

In [123]: pprt(M) 
_shape : (5, 5) 
dtype : float64 
rows : [[0] [1] [2] [3] [4]] 
data : [[1.0] [1.0] [1.0] [1.0] [1.0]] 
maxprint : 50 

しかし​​parserオブジェクトのために、それは明らかに不十分である:

In [124]: pprt(parser) 
conflict_handler : error 
usage : None 
prefix_chars : - 
_action_groups : [<argparse._ArgumentGroup object at 0xb0c802ac>, <argparse._ArgumentGroup object at 0xb0c99ccc>] 
_mutually_exclusive_groups : [] 
allow_abbrev : True 
_optionals : <argparse._ArgumentGroup object at 0xb0c99ccc> 
prog : ipython3 
description : None 
_actions : [_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None), _StoreAction(option_strings=['--k'], dest='k', nargs=None, const=None, default=100, type=<class 'int'>, choices=None, help='numbers, %(default)s', metavar=None)] 
.... 

オブジェクトは、多くの属性を持っています。クラス名が長いクラスもあります。いくつかのキーを持つ辞書ですが、長い値です。私はそれらを圧縮するために再帰のいくつかの並べ替えを行う必要があります。したがって、コンパクトなディスプレーヤーを書くことは可能ですが、それは多くの作業になります。

関連する問題