回答:
あなたは本当に2つの異なるものを混ぜ合わせています。
dir()
、vars()
またはinspect
モジュールを使用して、興味のあるものを取得します(__builtins__
例として使用しています。代わりに任意のオブジェクトを使用できます)。
>>> l = dir(__builtins__)
>>> d = __builtins__.__dict__
その辞書を好きなように印刷してください:
>>> print l
['ArithmeticError', 'AssertionError', 'AttributeError',...
または
>>> from pprint import pprint
>>> pprint(l)
['ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'DeprecationWarning',
...
>>> pprint(d, indent=2)
{ 'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
...
'_': [ 'ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'DeprecationWarning',
...
インタラクティブなデバッガーでは、きれいな印刷をコマンドとして使用することもできます。
(Pdb) pp vars()
{'__builtins__': {'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
'BaseException': <type 'exceptions.BaseException'>,
'BufferError': <type 'exceptions.BufferError'>,
...
'zip': <built-in function zip>},
'__file__': 'pass.py',
'__name__': '__main__'}
print re.compile(r'slots').search('No slots here either.').__slots__
inspect
答えの中でモジュールについてもっと話してみませんか?これはprint_rまたはvar_dumpに最も近いものだと思います。
dir()
では、によってリストされた属性の背後にある値にどのようにアクセスしますか?dir()
名前のリストのみを返します。属性内vars()
または__dict__
属性内に存在するものはすべてではありません。
とvars()
混合したいpprint()
:
from pprint import pprint
pprint(vars(your_object))
dir()
あなたはすべてのあなたは、おそらくのような気にしない事に建て与えます__str__
と__new__
。var()
しません。
__dict__
属性を持たないセットやその他のオブジェクトでは失敗します。
def dump(obj):
for attr in dir(obj):
print("obj.%s = %r" % (attr, getattr(obj, attr)))
例外処理、国別/特殊文字の印刷、ネストされたオブジェクトへの再帰など、作者の好みに応じて追加するサードパーティの関数は数多くあります。しかし、それらはすべて基本的にこれに要約されます。
getmembers()
に、標準inspect
モジュールで関数を使用できますが、これは一般的にイントロスペクションを行う方法を示すという点で、より便利だと思いました。
__dict__
(例えば、__doc__
と__module__
)。さらに、で__dict__
宣言されたオブジェクトに対してはまったく機能しません__slots__
。一般に、__dict__
実際にディクショナリに内部的に格納されているユーザーレベルのプロパティを示します。dir()はさらに表示します。
__dict__
属性/メンバーが含まれていません。私はそれがクレイジーだと知っていますが、本当です。int
and str
やre.MatchObject
s などの組み込みが一般的な例です。試してみて'hello'.__dict__
、試してみてくださいdir('hello')
dirについては言及しましたが、属性の名前しか得られません。それらの値も必要な場合は、__ dict__を試してください。
class O:
def __init__ (self):
self.value = 3
o = O()
出力は次のとおりです。
>>> o.__dict__
{'value': 3}
set
ありません__dict__
ので、彼らのためにそれがで失敗しますAttributeError: 'set' object has no attribute '__dict__'
これを行うには、「dir()」関数を使用できます。
>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdo
t__', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder
, 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'exc_clear', 'exc_info'
'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getcheckinterval', 'getdefault
ncoding', 'getfilesystemencoding', 'getrecursionlimit', 'getrefcount', 'getwindowsversion', 'he
version', 'maxint', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_
ache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit
, 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoption
', 'winver']
>>>
別の便利な機能はヘルプです。
>>> help(sys)
Help on built-in module sys:
NAME
sys
FILE
(built-in)
MODULE DOCS
http://www.python.org/doc/current/lib/module-sys.html
DESCRIPTION
This module provides access to some objects used or maintained by the
interpreter and to functions that interact strongly with the interpreter.
Dynamic objects:
argv -- command line arguments; argv[0] is the script pathname if known
オブジェクトの現在の状態を出力するには、次のようにします。
>>> obj # in an interpreter
または
print repr(obj) # in a script
または
print obj
クラスの定義__str__
または__repr__
メソッド。Pythonのドキュメントから:
__repr__(self)
repr()
組み込み関数と文字列変換(逆引用符)によって呼び出され、オブジェクトの「公式の」文字列表現を計算します。可能であれば、これは、同じ値を持つオブジェクトを再作成するために使用できる有効なPython式のように見えるはずです(適切な環境が与えられた場合)。これが不可能な場合は、「<... some役に立つ説明...>」という形式の文字列が返されます。戻り値は文字列オブジェクトでなければなりません。クラス定義は次の場合とrepr()ではなく__str__()
、次に__repr__()
そのクラスのインスタンスの「非公式」の文字列表現が要求される場合にも使用されます。これは通常、デバッグに使用されるため、表現が情報豊富で明確であることは重要です。
__str__(self)
str()
組み込み関数とprintステートメントによって呼び出され、オブジェクトの「非公式」文字列表現を計算します。これは__repr__()
、有効なPython式である必要がないという点で異なります。代わりに、より便利で簡潔な表現を使用できます。戻り値は文字列オブジェクトでなければなりません。
print "DEBUG: object value: " + repr(obj)
チェックアウトする価値があるかもしれません-
PerlのData :: Dumperに相当するPythonはありますか?
私の推薦はこれです-
https://gist.github.com/1071857
perlには、オブジェクトデータをperlソースコードに変換するData :: Dumperというモジュールがあることに注意してください(注:コードをソースに変換しないため、ほとんどの場合、出力でオブジェクトメソッド関数を使用しません)。これは永続化に使用できますが、一般的な目的はデバッグです。
標準のpython pprintが達成できないことがいくつかあります。特に、オブジェクトのインスタンスを検出すると下降を停止し、オブジェクトの内部16進ポインターを提供します(エラー、そのポインターは、道)。つまり、Pythonはこの優れたオブジェクト指向のパラダイムのすべてですが、箱から出したツールは、オブジェクト以外のものを操作するために設計されています。
perl Data :: Dumperを使用すると、移動する深さを制御でき、循環リンク構造も検出できます(これは非常に重要です)。オブジェクトには祝福以外の特別な魔法がないため、このプロセスはperlで根本的に簡単に実現できます(広く定義されたプロセス)。
の使用をお勧めしhelp(your_object)
ます。
help(dir)
If called without an argument, return the names in the current scope. Else, return an alphabetized list of names comprising (some of) the attributes of the given object, and of attributes reachable from it. If the object supplies a method named __dir__, it will be used; otherwise the default dir() logic is used and returns: for a module object: the module's attributes. for a class object: its attributes, and recursively the attributes of its bases. for any other object: its attributes, its class's attributes, and recursively the attributes of its class's base classes.
help(vars)
Without arguments, equivalent to locals(). With an argument, equivalent to object.__dict__.
ほとんどの場合、__dict__
またはdir()
を使用すると、必要な情報が得られます。さらに詳細が必要になった場合は、標準ライブラリにinspectモジュールが含まれています。これにより、印象的な詳細を取得できます。情報の実際の注意点には、次のものが含まれます。
あなただけを探しているなら、「私のオブジェクトがどのような属性値を持っているのか?」、そして、dir()
そして__dict__
おそらく十分です。あなたが本当に任意のオブジェクトの現在の状態を掘り下げようとしているなら(Pythonではほとんどすべてがオブジェクトであることを覚えておいてください)、inspect
検討する価値があります。
オブジェクトの現在のすべてのプロパティと値を出力するための組み込み関数はありますか?
いいえ。最も賛成された回答は、いくつかの種類の属性を除外し、受け入れられた回答は、メソッドと非公開APIの一部を含むすべての属性を取得する方法を示しています。しかし、良い完全な組み込みはありません関数。
したがって、短い結果として、独自に記述できますが、パブリックAPIの一部であるプロパティおよびその他の計算されたデータ記述子が計算されます。
from pprint import pprint
from inspect import getmembers
from types import FunctionType
def attributes(obj):
disallowed_names = {
name for name, value in getmembers(type(obj))
if isinstance(value, FunctionType)}
return {
name: getattr(obj, name) for name in dir(obj)
if name[0] != '_' and name not in disallowed_names and hasattr(obj, name)}
def print_attributes(obj):
pprint(attributes(obj))
多くの異なる種類のデータメンバーを持つクラスで、現在上位投票されている回答の適用を観察します。
from pprint import pprint
class Obj:
__slots__ = 'foo', 'bar', '__dict__'
def __init__(self, baz):
self.foo = ''
self.bar = 0
self.baz = baz
@property
def quux(self):
return self.foo * self.bar
obj = Obj('baz')
pprint(vars(obj))
プリントのみ:
{'baz': 'baz'}
のでvars
のみが返され__dict__
たオブジェクトの、そしてそれはあなたがVARSによって返された辞書を変更している場合は、コピーではないのです、あなたも修正している__dict__
オブジェクト自体のを。
vars(obj)['quux'] = 'WHAT?!'
vars(obj)
戻り値:
{'baz': 'baz', 'quux': 'WHAT?!'}
-これは悪いことです。quuxは、設定してはならないプロパティであり、名前空間に含めるべきではないからです...
現在受け入れられている回答(および他の回答)にアドバイスを適用することは、あまり良くありません。
>>> dir(obj)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'bar', 'baz', 'foo', 'quux']
ご覧のとおり、オブジェクトに関連付けられている名前のすべて(実際にはほとんど)dir
のみを返します。
inspect.getmembers
コメントに記載されている、同様に欠陥があります-すべての名前を返し、値をます。
教えるときに、生徒にオブジェクトの意味論的にパブリックなAPIを提供する関数を作成させます。
def api(obj):
return [name for name in dir(obj) if name[0] != '_']
これを拡張してオブジェクトのセマンティック名前空間のコピーを提供できますが、__slots__
割り当てられていないものを除外する必要があり、「現在のプロパティ」のリクエストを真剣に受けている場合は、計算されたプロパティを除外する必要があります(それらは高価になる可能性があり、「最新」ではないと解釈される可能性があります):
from types import FunctionType
from inspect import getmembers
def attrs(obj):
disallowed_properties = {
name for name, value in getmembers(type(obj))
if isinstance(value, (property, FunctionType))}
return {
name: getattr(obj, name) for name in api(obj)
if name not in disallowed_properties and hasattr(obj, name)}
そして今、私たちはプロパティquuxを計算したり表示したりしません:
>>> attrs(obj)
{'bar': 0, 'baz': 'baz', 'foo': ''}
しかし、おそらく私達は私達の特性が高価ではないことを知っています。それらを含めるためにロジックを変更することもできます。また、他の カスタムデータ記述子を除外したい場合もあります。
次に、この関数をさらにカスタマイズする必要があります。そのため、必要な機能を魔法のように正確に認識し、それを提供する組み込み関数を使用することはできません。これは、私たちが自分で作成する必要がある機能です。
これを行う組み込み関数はありません。状況に最も意味的に適切なことを行う必要があります。
FunctionType
ます。しかし、とても役に立ちました-ありがとう!
マジックを使ったメタプログラミングの例Dumpオブジェクト:
$猫dump.py
#!/usr/bin/python
import sys
if len(sys.argv) > 2:
module, metaklass = sys.argv[1:3]
m = __import__(module, globals(), locals(), [metaklass])
__metaclass__ = getattr(m, metaklass)
class Data:
def __init__(self):
self.num = 38
self.lst = ['a','b','c']
self.str = 'spam'
dumps = lambda self: repr(self)
__str__ = lambda self: self.dumps()
data = Data()
print data
引数なし:
$ python dump.py
<__main__.Data instance at 0x00A052D8>
$ python dump.py gnosis.magic MetaXMLPickler
<?xml version="1.0"?>
<!DOCTYPE PyObject SYSTEM "PyObjects.dtd">
<PyObject module="__main__" class="Data" id="11038416">
<attr name="lst" type="list" id="11196136" >
<item type="string" value="a" />
<item type="string" value="b" />
<item type="string" value="c" />
</attr>
<attr name="num" type="numeric" value="38" />
<attr name="str" type="string" value="spam" />
</PyObject>
少し時代遅れですが、まだ機能しています。
これをデバッグに使用していて、すべてを再帰的にダンプしたい場合は、クラスに__str__
すでに適切な実装が必要であるため、受け入れられた答えは満足できません。そうでない場合、これははるかにうまく機能します。
import json
print(json.dumps(YOUR_OBJECT,
default=lambda obj: vars(obj),
indent=1))
TypeError: vars() argument must have __dict__ attribute
トライppretty
from ppretty import ppretty
class A(object):
s = 5
def __init__(self):
self._p = 8
@property
def foo(self):
return range(10)
print ppretty(A(), show_protected=True, show_static=True, show_properties=True)
出力:
__main__.A(_p = 8, foo = [0, 1, ..., 8, 9], s = 5)
これにより、すべてのオブジェクトの内容がjsonまたはyamlのインデント形式で再帰的に出力されます。
import jsonpickle # pip install jsonpickle
import json
import yaml # pip install pyyaml
serialized = jsonpickle.encode(obj, max_depth=2) # max_depth is optional
print json.dumps(json.loads(serialized), indent=4)
print yaml.dump(yaml.load(serialized), indent=4)
私はpprintのみに言及している回答に賛成しました。明確にするために、複雑なデータ構造のすべての値を表示したい場合は、次のようにします。
from pprint import pprint
pprint(my_var)
ここで、my_varは目的の変数です。私が使用したときpprint(vars(my_var))
、私は何も得ず、ここでの他の答えが役に立たなかったか、メソッドが不必要に長く見えました。ちなみに、私の特定のケースでは、調べていたコードに辞書の辞書がありました。
いくつかのカスタムクラスでは、役に立たない<someobject.ExampleClass object at 0x7f739267f400>
種類の出力になってしまう可能性があることを指摘する価値があります。その場合は、__str__
メソッドを実装するか、他のソリューションのいくつかを試す必要があります。サードパーティのライブラリがなくても、すべてのシナリオで機能するシンプルなものを見つけたいと思っています。
「myObject」をダンプするには:
from bson import json_util
import json
print(json.dumps(myObject, default=json_util.default, sort_keys=True, indent=4, separators=(',', ': ')))
私はvars()とdir();を試しました。どちらも私が探していたものに失敗しました。オブジェクトに__dict__がなかったため、vars()は機能しませんでした(exceptions.TypeError:vars()引数には__dict__属性が必要です)。dir()は私が探していたものではありませんでした。これは単なるフィールド名のリストであり、値やオブジェクト構造を提供しません。
私はjson.dumps()がdefault = json_util.defaultなしでほとんどのオブジェクトで機能すると思いますが、オブジェクトに日時フィールドがあったため、標準のjsonシリアライザーが失敗しました。Pythonで「datetime.datetimeがJSONシリアル化可能ではない」を克服する方法を参照してください。
オブジェクト変数の印刷だけでなく、次のような美しい出力も役立ちます。
class(NormalClassNewStyle):
dicts: {
},
lists: [],
static_props: 1,
tupl: (1, 2)
Flaskデバッグツールバーを試すことができます。
https://pypi.python.org/pypi/Flask-DebugToolbar
from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension
app = Flask(__name__)
# the toolbar is only enabled in debug mode:
app.debug = True
# set a 'SECRET_KEY' to enable the Flask session cookies
app.config['SECRET_KEY'] = '<replace with a secret key>'
toolbar = DebugToolbarExtension(app)
__dict__
メンバー(re.MatchObject
たとえば)があるとは限りませんが、組み込みdir()
オブジェクトはすべてのオブジェクトに対して機能します。