2010-10-26 4 views
4

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

При попытке сделать это преобразование, будучи правильно Pythonic, я сделал прямое сравнение и действовал по результатам, как это:

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

Это на код, который работает независимо от типа, так что если SQLParameters[i] является 1 или «Blarg» или 123, я просто хочу, чтобы оставить его в покое, в то время как, когда это Boolean, мне нужно выполнить преобразование.

Это работало нормально, пока я не попытался вставить фактическое значение 1 (один), после чего я узнал, что 1 == True = True. Я могу ясно видеть два возможных решения этой проблемы:

  1. изменения словарь данных, чтобы использовать 0 и 1 в (1) поле номера как булев дублер, что делает преобразование проще
  2. добавить условие к приведенному выше коду, чтобы проверить фактический тип параметра, который нужно преобразовать (который поражает меня как unpythonic).

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

+2

Аллан: какой соединитель базы данных вы используете, не поддерживая логическое преобразование ???? – mouad

+1

Почему вы пытаетесь вставить значение '1' в поле, где действительны только «T» и «F»? Не сравнивайте с True и False; просто скажите 'SQLParameters [i] = True, если SQLParameters [i] else False', поэтому он всегда преобразуется. –

+0

Обратите внимание, что Postgresql имеет собственный Boolean-тип, а MySQL имеет определенное соглашение для булевых (хотя это не собственный тип). –

ответ

8

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

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

Это лучше всего отвечает на конкретный вопрос, который я задал. Однако, похоже, консенсусная точка зрения заключается в том, что я должен изменить словарь данных, который полностью исключает необходимость в коде. – Allan

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

или

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

+1: За исключением посторонней проверки типов, это золотой. :) – jathanism

+0

как насчет 'SQLParameters [i] = 'FT' [bool (SQLParameters [i])]' – SingleNegationElimination

0

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

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

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

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

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

"is" фиксирует идентификационные данные. http://docs.python.org/reference/expressions.html

Правда Pythonic (слабый datatyping и сокращенный код) будет SQLParameters [я] = «T», если SQLParameters [я] еще «F»

+0

Разве второе решение не сможет зафиксировать личность (которая является источником моей проблемы)? – Allan

1

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

Так что с виду, вы могли бы просто сделать это:

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

Это вернет значение для параметра «T» для всех ненулевых значений. Частью проблемы является то, что данный параметр не может быть булевым. – Allan

+0

Это правда. Я хотел, чтобы это была явная альтернатива проверке личности. – jathanism

0

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

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