Duncan Booth wrote: > Boris Borcic <[EMAIL PROTECTED]> wrote: > >> It is more elementary in the mathematician's sense, and therefore >> preferable all other things being equal, imo. I've tried to split >> 'gen' but I can't say the result is so much better. >> >> def flattendict(d) : >> gen = lambda L : (x for M in exp(L) for x in rec(M)) >> exp = lambda L : (L+list(kv) for kv in L.pop().iteritems()) >> rec = lambda M : gen(M) if isinstance(M[-1],dict) else [M] >> return dict((tuple(L[:-1]),L[-1]) for L in gen([d])) > > Why, why, why, why are you using lambda here?
Because the 3 lambdas make manifest that they could be combined into a single expression and thus reveal that they replace a single expression. > It only makes the code harder > to read Matter of perceptions. I myself tend to find def g(...) : def f(x) : return (whatever) return y(f) a bit hard to follow. So frankly I don't feel it betters anything to write def flattendict(d) : def gen(L) : return (x for M in exp(L) for x in rec(M)) def exp(L) : return (L+list(kv) for kv in L.pop().iteritems()) def rec(M) : return gen(M) if isinstance(M[-1],dict) else [M] return dict((tuple(L[:-1]),L[-1]) for L in gen([d])) But whatever to please you Cheers, BB -- http://mail.python.org/mailman/listinfo/python-list