Wow! 6 responses in just a few minutes. Thanks for all of the great feedback!
[EMAIL PROTECTED] wrote: > Rick> def parseline(line,format): > Rick> xlat = {'x':None,'s':str,'f':float,'d':int,'i':int} > Rick> result = [] > Rick> words = line.split() > Rick> for i in range(len(format)): > Rick> f = format[i] > Rick> trans = xlat.get(f,'None') > Rick> if trans: result.append(trans(words[i])) > Rick> if len(result) == 0: return None > Rick> if len(result) == 1: return result[0] > Rick> return result > > Note that your setting and testing of the trans variable is problematic. If > you're going to use xlat.get(), either spell None correctly or take the > default: > > trans = xlat.get(f) > if trans: > result.append(trans(words[i])) > > As Paul indicated though, it would also be better to not to silently let > unrecognized format characters pass. I probably wouldn't let KeyError float > up to the caller though: > > trans = xlat.get(f) > if trans: > result.append(trans(words[i])) > else: > raise ValueError, "unrecognized format character %s" % f > > Finally, you might consider doing the splitting outside of this function and > pass in a list. That way you could (for example) easily pass in a row of > values read by the csv module's reader class (untested): > > def format(words, fmt): > xlat = {'x':None,'s':str,'f':float,'d':int,'i':int} > result = [] > for i in range(len(fmt)): > f = fmt[i] > trans = xlat.get(f) > if trans: > result.append(trans(words[i])) > else: > raise ValueError, "unrecognized format character %s" % f > return result > > Rick> I'm posting this here because (1) I'm feeling smug at what a > Rick> bright little coder I am, and (2) (in a more realistic and humble > Rick> frame of mind) I realize that many many people have probably found > Rick> solutions to similar needs, and I'd imaging that many are better > Rick> than the above. I would love to hear how other people do similar > Rick> things. > > It seems quite clever to me. > > Skip -- http://mail.python.org/mailman/listinfo/python-list