pythonrepr

How to use __repr__ to create new object from it?


This is something I don't really get. I am trying to use __repr__ to create a new object from its output.

I have a class, OrderedSet, which contains a list and methods to organize it. The str method of this class is

def __str__(self):
    s = "Set contains: "
    for elem in self.list: s += (" '" + elem + "'")
    return s

Now I am supposed to use __repr__ in a way to instanciate a new object from it. Like Orderedset second = repr(first)

Can I just do it like this?

def __repr__(self):
    return self.list.__str__()

Solution

  • The idea behind "using __repr__ to create new objects" is that the output of __repr__ can be valid python code, which, when interpreted with eval, creates (a copy of) the original object. For example, repr("foo") return "'foo'" (including the quotes), or repr([1,2,3]) returns '[1, 2, 3]'.

    In your example you probably need something like this:

    def __repr__(self):
        return "OrderedSet(%r)" % self.list
    

    as well as a corresponding constructor:

    def __init__(self, elements):
        self.list = elements
    

    This way, repr(OrderedSet([1,2,3])) returns the string OrderedSet([1,2,3]), which, when evaluated, will invoke the contructor and create a new instance of the class.