Friday, February 11, 2011

When __repr__() is called?

print OBJECT calls OBJECT.__str__(), then when OBJECT.__repr__() is called? I see that print OBJECT calls OBJECT.__repr__() when OBJECT.__str__() doesn't exist, but I expect that's not the only way to call __repr__().

  • repr(obj)
    

    calls

    obj.__repr__
    

    the purpose of __repr__ is that it provides a 'formal' representation of the object that is supposed to be a expression that can be evaled to create the object. that is,

    obj == eval(repr(obj))
    

    should, but does not always in practice, yield True

    I was asked in the comments for an example of when obj != eval(repr(obj)).

    class BrokenRepr(object):
        def __repr__(self):
            return "not likely"
    

    here's another one:

    >>> con = sqlite3.connect(':memory:')
    >>> repr(con)
    '<sqlite3.Connection object at 0xb773b520>'
    >>> 
    
    inspectorG4dget : Why does obj == eval(repr(obj)) not always give True? Would you be able to give an example?
    Avi : For a complex object, such as a file, it will not necessarily return True.
    Mike Axiak : @inspectorG4dget: obj == eval(type('myclass', (), {}))
    inspectorG4dget : Many thanks @AaronMcSmooth, @Avi, @MikeAxiak for explaining this. ++ to all
  • repr(obj) calls obj.__repr__.

    This is intended to clearly describe an object, specially for debugging purposes. More info in the docs

    Flávio Amieiro : @S.Lott thanks for pointing out my markup mistake, it's fixed now. I just don't know which guidelines you're referring to.
  • In python 2.x, `obj` will end up calling obj.__repr__(). It's shorthand for repr().

    S.Lott : -1: Deprecated syntax, which will be removed.
    recursive : @S. Lott: Noted in answer
    From recursive
  • Not only does repr get called when you use repr(), but also in the following cases:

    1. You type obj in the shell and press enter.
    2. You ever print an object in a dictionary/tuple/list. E.g.: print [u'test'] does not print ['test']
    From Mike Axiak

0 comments:

Post a Comment