Pythonic Boolean Conversion - PullRequest
       32

Pythonic Boolean Conversion

4 голосов
/ 27 октября 2010

Я пишу модуль для обработки данных, отправляемых в базу данных из Python.Поскольку логическое значение не является типом данных SQL, эти значения должны быть преобразованы в предварительно определенное значение.При определении таблиц я решил, что я буду использовать 'T' и 'F' в поле varchar (1) в качестве моего логического элемента.

Пытаясь сделать это преобразование, будучи должным образом 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. измените словарь данных, чтобы использовать 0 и 1 в поле числа (1) в качестве логического заменителя, упрощая преобразование
  2. добавьте условие в приведенный выше код, чтобы проверить фактический тип параметра, который нужно преобразовать (что мне кажется неумным).

Кто-нибудь имеет представление о том, как выполнить это безизменить словарь данных или явно проверить тип?

Ответы [ 6 ]

9 голосов
/ 27 октября 2010

Вы можете использовать is:

if SQLParameters[i] is True:
    SQLParameters[i] = 'T'                
elif SQLParameters[i] is False:
    SQLParameters[i] = 'F'
3 голосов
/ 27 октября 2010
if isinstance(SQLParameters[i], bool):
    SQLParameters[i] = 'T' if SQLParameters[i] else 'F'

или

if isinstance(SQLParameters[i], bool):
    SQLParameters[i] = 'FT'[SQLParameters[i]]
1 голос
/ 27 октября 2010

Нет необходимости явно проверять наличие или идентичность значения SQLParameters[i], равного True или False.В Python все, что не установлено (например, пустые последовательности), None, 0 или False, оценивается как False;все остальное оценивается как True.

Итак, помня об этом, вы можете просто сделать следующее:

if SQLParameters[i]:
    SQLParameters[i] = 'T'
else:
    SQLParameters[i] = 'F'
1 голос
/ 27 октября 2010

Попробуйте использовать

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

"is" захватывает тождества. http://docs.python.org/reference/expressions.html

True Pythonic (слабый тип данных и сокращенный код) будет SQLParameters [i] = 'T', если SQLParameters [i] еще 'F'

0 голосов
/ 27 октября 2010

Я рекомендую использовать 0 и 1. Так делает библиотека SQLite.Я бы явно установил новое значение в False, а затем изменил бы его на true (или наоборот).

convertedvalue = 0
   if SQLParameters[i] is True:
      convertedvalue = 1
SQLParameters[i] = convertedvalue
0 голосов
/ 27 октября 2010

Вы можете проверить тип объекта:

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

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