On 09/17/2012 07:47 AM, Steven D'Aprano wrote: > On Mon, 17 Sep 2012 06:46:55 -0400, Dave Angel wrote: > >> On 09/16/2012 11:25 PM, alex23 wrote: >>> def readlines(f): >>> lines = [] >>> while "f is not empty": >>> line = f.readline() >>> if not line: break >>> if len(line) > 2 and line[-2:] == '|\n': >>> lines.append(line) >>> yield ''.join(lines) >>> lines = [] >>> else: >>> lines.append(line) >> There's a few changes I'd make: >> I'd change the name to something else, so as not to shadow the built-in, > Which built-in are you referring to? There is no readlines built-in. > > py> readlines > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > NameError: name 'readlines' is not defined > > > There is a file.readlines method, but that lives in a different namespace > to the function readlines so there should be no confusion. At least not > for a moderately experienced programmer, beginners can be confused by the > littlest things sometimes.
You're right of course, and that's not restricted to beginners. I've been at this for over 40 years, and I make that kind of mistake once in a while. Fortunately, when I make such a mistake on this forum, you usually pop in to keep me honest. When I make it in code, I either get a runtime error, or no harm is done. > >> and to make it clear in caller's code that it's not the built-in one. >> I'd replace that compound if statement with >> if line.endswith("|\n": >> I'd add a comment saying that partial lines at the end of file are >> ignored. > Or fix the generator so that it doesn't ignore partial lines, or raises > an exception, whichever is more appropriate. > > > -- DaveA -- http://mail.python.org/mailman/listinfo/python-list