Reputation: 17429
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 can plainly see two possible solutions for this issue:
Does anyone have an idea about how to accomplish this without either changing the data dictionary or explicitly checking the type?
Upvotes: 4
Views: 2190
Reputation: 33716
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'
Upvotes: 1
Reputation: 945
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
Upvotes: 0
Reputation: 171
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'
Upvotes: 1
Reputation: 123498
You could check the type of the object:
In [8]: isinstance(True, bool)
Out[8]: True
In [9]: isinstance(1, bool)
Out[9]: False
Upvotes: 0
Reputation: 5021
if isinstance(SQLParameters[i], bool):
SQLParameters[i] = 'T' if SQLParameters[i] else 'F'
or
if isinstance(SQLParameters[i], bool):
SQLParameters[i] = 'FT'[SQLParameters[i]]
Upvotes: 3
Reputation: 229593
You can use is
:
if SQLParameters[i] is True:
SQLParameters[i] = 'T'
elif SQLParameters[i] is False:
SQLParameters[i] = 'F'
Upvotes: 9