So what I\'m looking for here is something like PHP\'s print_r function. This is so I can debug my scripts by seeing what\'s the state of the object in question.
问题:
回答1:
You are really mixing together two different things.
Use dir()
, vars()
or the inspect
module to get what you are interested in (I use __builtins__
as an example; you can use any object instead).
>>> l = dir(__builtins__)
>>> d = __builtins__.__dict__
Print that dictionary however fancy you like:
>>> print l
[\'ArithmeticError\', \'AssertionError\', \'AttributeError\',...
or
>>> 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\',
...
Pretty printing is also available in the interactive debugger as a command:
(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__\'}
回答2:
You want vars()
mixed with pprint()
:
from pprint import pprint
pprint(vars(your_object))
回答3:
def dump(obj):
for attr in dir(obj):
print(\"obj.%s = %r\" % (attr, getattr(obj, attr)))
There are many 3rd-party functions out there that add things like exception handling, national/special character printing, recursing into nested objects etc. according to their authors\' preferences. But they all basically boil down to this.
回答4:
dir has been mentioned, but that\'ll only give you the attributes\' names. If you want their values as well try __dict__.
class O:
def __init__ (self):
self.value = 3
o = O()
Here is the output:
>>> o.__dict__
{\'value\': 3}
回答5:
You can use the \"dir()\" function to do this.
>>> 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\']
>>>
Another useful feature is help.
>>> 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
回答6:
To print the current state of the object you might:
>>> obj # in an interpreter
or
print repr(obj) # in a script
or
print obj
For your classes define __str__
or __repr__
methods. From the Python documentation:
__repr__(self)
Called by therepr()
built-in function and by string conversions (reverse quotes) to compute the \"official\" string representation of an object. If at all possible, this should look like a valid Python expression that could be used to recreate an object with the same value (given an appropriate environment). If this is not possible, a string of the form \"<...some useful description...>\" should be returned. The return value must be a string object. If a class defines repr() but not__str__()
, then__repr__()
is also used when an \"informal\" string representation of instances of that class is required. This is typically used for debugging, so it is important that the representation is information-rich and unambiguous.
__str__(self)
Called by thestr()
built-in function and by the print statement to compute the \"informal\" string representation of an object. This differs from__repr__()
in that it does not have to be a valid Python expression: a more convenient or concise representation may be used instead. The return value must be a string object.
回答7:
Might be worth checking out --
Is there a Python equivalent to Perl's Data::Dumper?
My recommendation is this --
https://gist.github.com/1071857
Note that perl has a module called Data::Dumper which translates object data back to perl source code (NB: it does NOT translate code back to source, and almost always you don\'t want to the object method functions in the output). This can be used for persistence, but the common purpose is for debugging.
There are a number of things standard python pprint fails to achieve, in particular it just stops descending when it sees an instance of an object and gives you the internal hex pointer of the object (errr, that pointer is not a whole lot of use by the way). So in a nutshell, python is all about this great object oriented paradigm, but the tools you get out of the box are designed for working with something other than objects.
The perl Data::Dumper allows you to control how deep you want to go, and also detects circular linked structures (that\'s really important). This process is fundamentally easier to achieve in perl because objects have no particular magic beyond their blessing (a universally well defined process).
回答8:
In most cases, using __dict__
or dir()
will get you the info you\'re wanting. If you should happen to need more details, the standard library includes the inspect module, which allows you to get some impressive amount of detail. Some of the real nuggests of info include:
- names of function and method parameters
- class hierarchies
- source code of the implementation of a functions/class objects
- local variables out of a frame object
If you\'re just looking for \"what attribute values does my object have?\", then dir()
and __dict__
are probably sufficient. If you\'re really looking to dig into the current state of arbitrary objects (keeping in mind that in python almost everything is an object), then inspect
is worthy of consideration.
回答9:
A metaprogramming example Dump object with magic:
$ cat 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
Without arguments:
$ python dump.py
<__main__.Data instance at 0x00A052D8>
With Gnosis Utils:
$ 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>
It is a bit outdated but still working.
回答10:
If you\'re using this for debugging, and you just want a recursive dump of everything, the accepted answer is unsatisfying because it requires that your classes have good __str__
implementations already. If that\'s not the case, this works much better:
import json
print(json.dumps(YOUR_OBJECT,
default=lambda obj: vars(obj),
indent=1))
回答11:
This prints out all the object contents recursively in json or yaml indented format:
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)
回答12:
I was needing to print DEBUG info in some logs and was unable to use pprint because it would break it. Instead I did this and got virtually the same thing.
DO = DemoObject()
itemDir = DO.__dict__
for i in itemDir:
print \'{0} : {1}\'.format(i, itemDir[i])
回答13:
To dump \"myObject\":
from bson import json_util
import json
print(json.dumps(myObject, default=json_util.default, sort_keys=True, indent=4, separators=(\',\', \': \')))
I tried vars() and dir(); both failed for what I was looking for. vars() didn\'t work because the object didn\'t have __dict__ (exceptions.TypeError: vars() argument must have __dict__ attribute). dir() wasn\'t what I was looking for: it\'s just a listing of field names, doesn\'t give the values or the object structure.
I think json.dumps() would work for most objects without the default=json_util.default, but I had a datetime field in the object so the standard json serializer failed. See How to overcome "datetime.datetime not JSON serializable" in python?
回答14:
from pprint import pprint
def print_r(the_object):
print (\"CLASS: \", the_object.__class__.__name__, \" (BASE CLASS: \", the_object.__class__.__bases__,\")\")
pprint(vars(the_object))
回答15:
Just try beeprint.
It will help you not only with printing object variables, but beautiful output as well, like this:
class(NormalClassNewStyle):
dicts: {
},
lists: [],
static_props: 1,
tupl: (1, 2)
回答16:
pprint contains a “pretty printer” for producing aesthetically pleasing representations of your data structures. The formatter produces representations of data structures that can be parsed correctly by the interpreter, and are also easy for a human to read. The output is kept on a single line, if possible, and indented when split across multiple lines.
回答17:
Try 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)
Output:
__main__.A(_p = 8, foo = [0, 1, ..., 8, 9], s = 5)
回答18:
Why not something simple:
for key,value in obj.__dict__.iteritems():
print key,value
回答19:
I\'ve upvoted the answer that mentions only pprint. To be clear, if you want to see all the values in a complex data structure, then do something like:
from pprint import pprint
pprint(my_var)
Where my_var is your variable of interest. When I used pprint(vars(my_var)) I got nothing, and other answers here didn\'t help or the method looked unnecessarily long. By the way, in my particular case, the code I was inspecting had a dictionary of dictionaries.
Worth pointing out that with some custom classes you may just end up with an unhelpful <someobject.ExampleClass object at 0x7f739267f400>
kind of output. In that case, you might have to implement a __str__
method, or try some of the other solutions. I\'d still like to find something simple that works in all scenarios, without third party libraries.
回答20:
I recommend using 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__.
回答21:
You can try the Flask Debug Toolbar.
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)
回答22:
I like working with python object built-in types keys or values.
For attributes regardless they are methods or variables:
o.keys()
For values of those attributes:
o.values()
回答23:
For everybody struggling with
vars()
not returning all attributes.dir()
not returning the attributes\' values.
The following code prints all attributes of obj
with their values:
for attr in dir(obj):
try:
print(\"obj.{} = {}\".format(attr, getattr(obj, attr)))
except AttributeError:
print(\"obj.{} = ?\".format(attr))