Pythonic Boolean Conversion
I'm writing a module to act on data being sent to a database from Python. Since boolean is not a SQL datatype, those values have to be converted to some pre-defined value. I decided while defining the tables that I would use 'T' and 'F' in a varchar(1) field as my Boolean stand in.
In attempting to make this conversion while being properly Pythonic, I did a direct comparison and acted on the results, as so:
if SQLParameters[i] == True:
SQLParameters[i] = 'T'
elif SQLParameters[i] == False:
SQLParameters[i] = 'F'
This is on code that runs regardless of type, so if SQLParameters[i]
is 1 or "Blarg" or 123, I just want to leave it alone, whereas when it's a Boolean, I need to perform the conversion.
This worked just fine until I tried to insert the actual value 1 (one), at which point I learned that 1 == True = True
. I开发者_如何学Python can plainly see two possible solutions for this issue:
- change the data dictionary to use 0 and 1 in a number(1) field as the Boolean stand-in, making the conversion simpler
- add a condition to the code above to check the actual type of the parameter to be converted (which strikes me as unpythonic).
Does anyone have an idea about how to accomplish this without either changing the data dictionary or explicitly checking the type?
You can use is
:
if SQLParameters[i] is True:
SQLParameters[i] = 'T'
elif SQLParameters[i] is False:
SQLParameters[i] = 'F'
if isinstance(SQLParameters[i], bool):
SQLParameters[i] = 'T' if SQLParameters[i] else 'F'
or
if isinstance(SQLParameters[i], bool):
SQLParameters[i] = 'FT'[SQLParameters[i]]
Try using
if SQLParameters[i] is True:
SQLParameters[i] = 'T'
elif SQLParameters[i] is False:
SQLParameters[i] = 'F'
"is" captures identities. http://docs.python.org/reference/expressions.html
True Pythonic (weak datatyping and abbreviated code) would be SQLParameters[i] = 'T' if SQLParameters[i] else 'F'
There is no need to explicitly test against the identity or value of SQLParameters[i]
being True
or False
. In Python anything that is unset (such as empty sequences), None
, 0
, or False
evaluates to False
; everything else evaluates to True
.
So with that in mind you could simply do this:
if SQLParameters[i]:
SQLParameters[i] = 'T'
else:
SQLParameters[i] = 'F'
You could check the type of the object:
In [8]: isinstance(True, bool)
Out[8]: True
In [9]: isinstance(1, bool)
Out[9]: False
I do recommend that you use 0 and 1. The SQLite libary does it that way. I would explicitly set the new value to False and then change it to true (or vice versa).
convertedvalue = 0
if SQLParameters[i] is True:
convertedvalue = 1
SQLParameters[i] = convertedvalue
精彩评论