<div class="gmail_quote">On 29 September 2012 21:15, Albert-Jan Roskam <span dir="ltr"><<a href="mailto:fomcl@yahoo.com" target="_blank">fomcl@yahoo.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
<br>
I've written a __repr__ method that is supposed to *always* work. That is, it returns an eval-able text representation of any class instance.<br>
Will this really always work?</blockquote><div><br></div><div>No.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> I'd find it useful is this is standard behavior of Python. Or am I overlooking something?<br>
</blockquote><div><br></div><div>Yes.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<br>
import inspect<br>
<br>
class X (object):<br>
<br>
    def __init__(self, x=1, y='n'):<br>
        self.x = x<br>
        self.y = y<br>
<br>
    def __repr__(self):           <br>
        code = self.__class__.__name__ + "("<br>
        for arg in inspect.getargspec(self.__init__).args [1:]  :<br>
            if isinstance(eval("self." + arg), basestring):<br></blockquote><div><br></div><div>I'd prefer getattr(self, arg) to eval("self." + arg).</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

                code += ("%(" + arg + ")r, ")<br>
            else:<br>
                code += ("%(" + arg + ")s, ")<br>
        code = code[:-2] + ")"<br>
        return code % self.__dict__<br>
<br>
x = X()<br>
eval(repr(x))<br></blockquote><div><br></div><div>This repr method assumes that every argument to __init__ is stored as an attribute with the same name as the parameter to __init__. Consider:</div><div><br></div><div>def __init__(self, name):</div>
<div>    self.other_name = name</div><div><br></div><div>Also how do you handle:</div><div><br></div><div>def __init__(self, *args, **kwargs):</div><div><br></div><div>Oscar</div></div>