Pythonic布尔转换

时间:2010-10-26 20:37:17

标签: python database boolean

我正在编写一个模块来处理从Python发送到数据库的数据。由于boolean不是SQL数据类型,因此必须将这些值转换为某个预定义值。我在定义表时决定在varchar(1)字段中使用'T'和'F'作为我的布尔值。

在尝试使用Pythonic时进行此转换时,我进行了直接比较并对结果采取了行动,如下所示:

        if SQLParameters[i] == True:
            SQLParameters[i] = 'T'                
        elif SQLParameters[i] == False:
            SQLParameters[i] = 'F'

这是在不管类型的情况下运行的代码,因此如果SQLParameters[i]为1或“Blarg”或123,我只想将其保留,而当它是布尔值时,我需要执行转换。

这很好用,直到我尝试插入实际值1(一),此时我学会了1 == True = True。我可以清楚地看到这个问题的两种可能的解决方案:

  1. 将数据字典更改为使用数字(1)字段中的0和1作为布尔替换,使转换更简单
  2. 在上面的代码中添加一个条件来检查要转换的参数的实际类型(这让我觉得是unpythonic)。
  3. 有没有人知道如何在不更改数据字典或明确检查类型的情况下完成此操作?

6 个答案:

答案 0 :(得分:9)

您可以使用is

if SQLParameters[i] is True:
    SQLParameters[i] = 'T'                
elif SQLParameters[i] is False:
    SQLParameters[i] = 'F'

答案 1 :(得分:3)

if isinstance(SQLParameters[i], bool):
    SQLParameters[i] = 'T' if SQLParameters[i] else 'F'

if isinstance(SQLParameters[i], bool):
    SQLParameters[i] = 'FT'[SQLParameters[i]]

答案 2 :(得分:1)

尝试使用

if SQLParameters[i] is True:
     SQLParameters[i] = 'T'                
elif SQLParameters[i] is False:
     SQLParameters[i] = 'F'

“是”捕获身份。 http://docs.python.org/reference/expressions.html

True Pythonic(弱数据类型和缩写代码)将是 SQLParameters [i] ='T'如果SQLParameters [i]否则'F'

答案 3 :(得分:1)

无需明确测试SQLParameters[i] TrueFalse的身份或价值。在Python中任何未设置的内容(例如空序列),None0False都会计算为False;其他一切评估为True

所以考虑到这一点,你可以简单地这样做:

if SQLParameters[i]:
    SQLParameters[i] = 'T'
else:
    SQLParameters[i] = 'F'

答案 4 :(得分:0)

您可以检查对象的类型:

In [8]: isinstance(True, bool)
Out[8]: True

In [9]: isinstance(1, bool)
Out[9]: False

答案 5 :(得分:0)

我建议您使用0和1.SQLite库就是这样做的。我会明确地将新值设置为False,然后将其更改为true(反之亦然)。

convertedvalue = 0
   if SQLParameters[i] is True:
      convertedvalue = 1
SQLParameters[i] = convertedvalue