Checking each item in m.group()?

Scott David Daniels Scott.Daniels at Acm.Org
Mon Jun 2 20:49:11 EDT 2008


Gilles Ganault wrote:
> On Mon, 2 Jun 2008 12:06:21 -0700 (PDT), Matimus <mccredie at gmail.com>
> wrote:
>> Here is a brief example. Note that this code is very insecure ....
> 
>> sql = "INSERT INTO mytable (col1, col2) VALUES ('%s','%s')"%tuple(
>>        (c, "NULL")[c == ''] for c in m.groups()
>>        )
> I don't understand this syntax :-/
(c, "NULL") is  a tuple; it is being indexed by the boolean "c == ''"
Since False is 0, and True is 1, the expression picks out "NULL"
exactly when c is the zero-length string.

A more idiomatic Python way of writing this (for the very special case
of '' or 0 or 0.0, or ...) is
     sql = "INSERT INTO mytable (col1, col2) VALUES ('%s','%s')" % tuple(
                                       (c or "NULL") for c in m.groups())

You can avoid problems w/ possible 0s or 0.0s or .. by using:
                                   (str(c) or "NULL") for c in groups())

the "or" (or a similar "and" trick) will continue to work.  The
different "empty" or "nothing" values of a data type are treated as
false in part to allow such shenanigans.  If used sparingly, it make
your code clearer, but over-use can make the reader scratch his head in 
wonder.

--Scott David Daniels
Scott.Daniels at Acm.Org



More information about the Python-list mailing list