idiomatic analogue of Perl's: while (<>) { ... }

Steven D'Aprano steve+comp.lang.python at pearwood.info
Thu Sep 1 08:02:54 CEST 2011


On Thu, 1 Sep 2011 02:56 pm Sahil Tandon wrote:

> I've been tasked with converting some programs from Perl -> Python, and
> am (as will soon be obvious) new to the language.  A few archive/google
> searches were inconclusive on a consensus approach, which is OK, but I
> just wonder if there is a more Python-esque way to do the following in
> Python 2.7.1:
> 
> %%
> # unbuffer STDOUT
> sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

I've never bothered with unbuffered stdout, but that looks fine to me.

I'm not sure if it is necessary though, because print seems to automatically
flush the buffer after each line in my testing. Unless you're printing
repeatedly to the same line, I'm not sure unbuffered stdout is helpful.


> # process input, line-by-line, and print responses after parsing input
> while 1:
>   rval = parse(raw_input())
>   if rval == None:
>     print('foo')
>   else:
>     print('bar')
> %%

"while True" is considered slightly more idiomatic (readable), but
otherwise, that seems fine.

 
> This works, but while reading the documentation, I thought of using 'for
> line in fileinput.input()' in lieu of 'while 1:' construct.  This does
> not work when debugging the program on the command line -- the script
> appears to just hang no matter what is typed into STDIN.  I believe this
> is because of some internal buffering when using fileinput.  Is there a
> recommended way to disable such buffering?  Am I taking a totally wrong
> approach?

I'm not sure anything about fileinput is exactly *recommended*, it's kinda
discouraged on account of being a bit slow. See help(fileinput) at the
interactive prompt.

For what it's worth, the default buffersize for fileinput.input is 0, so if
that doesn't do what you want, I don't think fileinput is the right
solution.



-- 
Steven




More information about the Python-list mailing list