converting a sed / grep / awk / . . . bash pipe line into python

Peter Otten __peter__ at web.de
Wed Sep 3 08:19:19 EDT 2008


Roy Smith wrote:

> In article <g9ldi5$2ea$03$1 at news.t-online.com>,
>  Peter Otten <__peter__ at web.de> wrote:
> 
>> Without them it looks better:
>> 
>> import sys
>> for line in sys.stdin:
>>     try:
>>         a, b = map(int, line.split(None, 2)[:2])
>>     except ValueError:
>>         pass
>>     else:
>>         if a + b == 42:
>>             print b
> 
> I'm philosophically opposed to one-liners 

I'm not, as long as you don't /force/ the code into one line.

> like: 
> 
>>         a, b = map(int, line.split(None, 2)[:2])
> 
> because they're difficult to understand at a glance.  You need to visually
> parse it and work your way out from the inside to figure out what's going
> on.  Better to keep it longer and simpler.
> 
> Now that I've got my head around it, I realized there's no reason to make
> the split part so complicated.  No reason to limit how many splits get
> done
> if you're explicitly going to slice the first two.  And since you don't
> need to supply the second argument, the first one can be defaulted as
> well. So, you immediately get down to:
> 
>>         a, b = map(int, line.split()[:2])

I agree that the above is an improvement.
 
> which isn't too bad.  I might take it one step further, however, and do:
> 
>>         fields = line.split()[:2]
>>         a, b = map(int, fields)
> 
> in fact, I might even get rid of the very generic, but conceptually
> overkill, use of map() and just write:
> 
>>         a, b = line.split()[:2]
>>         a = int(a)
>>         b = int(b)

If you go that route your next step is to introduce another try...except,
one for the unpacking and another for the integer conversion...

Peter



More information about the Python-list mailing list