tl;dr: A beautiful pattern exposes the "innards" of any class to 
g.printObj, Leo's best way of showing data.

Here is the new __repr__ for the g.GeneralSetting class:

def __repr__(self):
    # Better for g.printObj.
    val = str(self.val).replace('\n', ' ')
    return 'GS: %20s %7s = %s' % (
        g.shortFileName(self.path), self.kind, g.truncate(val, 50))

This puts the crucial data on a single line.  This is exactly what I'll 
need when working in the settings branch.

Here is the __repr__ for both the g.TypedDict and g.TypedDictOfLists 
classes:

def __repr__(self):
    """Suitable for g.printObj"""
    return '%s\n%s\n' % (g.dictToString(self.d), str(self))

g.dictToString is one of g.printObj's helpers.  It aligns all the 
dictionary keys.  Crucially, g.printObj need not know about the "inner" 
dict, self.d.  g.printObj "just works".

The __str__ method of the two g.TypedDict classes is a summary.  For 
example, for g.TypedDict:

def __str__(self):
    """Concise: used by repr."""
    return '<TypedDict name:%s keys:%s values:%s len(keys): %s>' % (
        self._name,
        self.keyType.__name__,
        self.valType.__name__,
        len(list(self.keys())))

*Summary*

This pattern leverages all the good work I have done with g.printObj.  When 
a class's __repr__ method returns g.objToString (or one of it's helpers), 
__repr__ will do a better job than a hand-written dump method.

I'm glad I didn't discover this pattern until well into the work on #1316 
<https://github.com/leo-editor/leo-editor/issues/1316>. Had I done so, I 
probably would not have done the work I did on cleaning g.TypedDict and 
g.TypedDictOfLists, to be described in another post.

Edward

-- 
You received this message because you are subscribed to the Google Groups 
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/leo-editor/ed857c72-3845-4b7e-a3c7-c98bb3d97760%40googlegroups.com.

Reply via email to