通过打印来检查变量(对象)

时间:2014-07-14 19:00:07

标签: python ruby

在Ruby中,可以通过p my_obj检查变量(对象),因此它会将其打印为“深度”并尽可能详细。它对日志记录和调试很有用。在python中我认为它是print my_obj,只是它打印得不多,但<requests.sessions.Session object at 0x7febcb29b390>根本没用。

我该怎么做?

5 个答案:

答案 0 :(得分:3)

您可以使用vars内置方法获取对象属性的字典:

>>> import requests
>>> r = requests.Session()
>>> vars(r)
{'cookies': <<class 'requests.cookies.RequestsCookieJar'>[]>, 'stream': False, 'hooks': {'response': []}, 'auth': None, 'trust_env': True, ...}

也许将它与pprint结合起来得到一个有点格式化的输出:

>>> import pprint
>>> pprint.pprint(vars(r), indent=2)
{ 'adapters': OrderedDict([('https://', <requests.adapters.HTTPAdapter object at 0x103106690>), ('http://', <requests.adapters.HTTPAdapter object at 0x103106790>)]),
  'auth': None,
  'cert': None,
  'cookies': <<class 'requests.cookies.RequestsCookieJar'>[]>,
  ...

答案 1 :(得分:3)

我推荐inspect模块:

import inspect
print inspect.getmembers(my_obj)

这包括__dict__,但也包括有关该对象的所有方法的详细信息,这可能非常有用。

答案 2 :(得分:2)

这是&#34; print&#34;最通用的方法。一个对象,只是不是每个对象都有一个非常有用的打印输出;事实上,很可能并非如此。

如果您正在使用其他人创建的对象,您通常会查看文档以了解如何查看其变量等等。这往往会给你最漂亮的输出。这个问题的其他答案提供了一种检查对象的更通用的方法,这比查找文档要快得多,也更容易;据我所知,他们做了一个更浅层的检查,但他们是一个很好的起点。

如果您正在创建自己的对象,那么您将要定义一个名为__str__()的方法,该方法返回一个字符串。然后,只要您说print obj,就会调用该对象的__str__()函数,并返回该字符串。

在您的情况下,如果您有一个名为request.Session()的{​​{1}}对象,根据文档,您可以使用my_obj进行打印。

http://docs.python-requests.org/en/latest/user/advanced/

答案 3 :(得分:2)

dir()可能会给你你想要的东西:

for key in dir(my_obj):
    print('{}: {}'.format(key, getattr(my_obj, key))

如果我不得不猜测,那里有更多你想要的信息:)

答案 4 :(得分:-1)

如果您想完全控制对象的打印,请为您的班级定义__repr____str__函数。

class Node(object):
    """ A node object with an index"""
    def __init__(self,index = 0):
        self.index = index

    def __repr__(self):
        print "Node %s" % self.index

    def __str__(self):
        print "Node %s" % self.index

有时您会希望查看详细信息,因此只覆盖__str__可能是个好主意。

有关repr和str之间区别的详细信息:Difference between __str__ and __repr__ in Python