Armin Rigo wrote: > Hi, > > On Thu, Jul 27, 2006 at 03:39:39AM -0400, Sylvain Fourmanoit wrote: > >> Having JSON there would indeed be nice: In fact, I recall being initially >> surprised it was not supported by the standard library. >> >> But is there a need to choose? Why not have both? The miniconf approach >> has its advantages and differences: >> > > I support this point of view: miniconf fills the hole that the stdlib > leaves for a safe and cross-version dumper/loader for simple objects > using the Python syntax. In the same spirit, maybe it could be slightly > re-oriented towards a dumper/loader for more than config files; for > example, it could provide a safe inverse of repr() for common built-in > types. Such a functionality has been discussed here a few times if I > remember correctly, but the code in miniconf is very close to providing > it. > ConfigObj [1] gained an 'unrepr' mode a while back. The code is simple, and originally came from CherryPy.
It can (safely) unrepr basic datatypes. import compiler def getObj(s): s = "a=" + s p = compiler.parse(s) return p.getChildren()[1].getChildren()[0].getChildren()[1] class UnknownType(Exception): pass class Builder: def build(self, o): m = getattr(self, 'build_' + o.__class__.__name__, None) if m is None: raise UnknownType(o.__class__.__name__) return m(o) def build_List(self, o): return map(self.build, o.getChildren()) def build_Const(self, o): return o.value def build_Dict(self, o): d = {} i = iter(map(self.build, o.getChildren())) for el in i: d[el] = i.next() return d def build_Tuple(self, o): return tuple(self.build_List(o)) def build_Name(self, o): if o.name == 'None': return None if o.name == 'True': return True if o.name == 'False': return False # An undefinted Name raise UnknownType('Undefined Name') def build_Add(self, o): real, imag = map(self.build_Const, o.getChildren()) try: real = float(real) except TypeError: raise UnknownType('Add') if not isinstance(imag, complex) or imag.real != 0.0: raise UnknownType('Add') return real+imag def build_Getattr(self, o): parent = self.build(o.expr) return getattr(parent, o.attrname) def build_UnarySub(self, o): return -self.build_Const(o.getChildren()[0]) def build_UnaryAdd(self, o): return self.build_Const(o.getChildren()[0]) def unrepr(s): if not s: return s return Builder().build(getObj(s)) HTH Michael Foord [1] http://www.voidspace.org.uk/python/configobj.html > > A bientot, > > Armin > _______________________________________________ > Python-Dev mailing list > Python-Dev@python.org > http://mail.python.org/mailman/listinfo/python-dev > Unsubscribe: > http://mail.python.org/mailman/options/python-dev/fuzzyman%40voidspace.org.uk > > _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com