Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 3, 2011 12:55:27

whitehat
От:
Зарегистрирован: 2011-11-03
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

непонятки с типами, с None

Привет всем!
есть SQL запрос

c.execute("""select max(suc_iter) from results where product_id = %s""", (int(product_id[0])))
print type(c.fetchone()[0])
if c.fetchone()[0] is not None:
age = int(c.fetchone()[0]) + 1
else:
age = 1
То-есть если запрос возвращает Null, я хочу переменной присвоить единичку, если число - добавить единичку….
а на деле
<type 'long'>
Traceback (most recent call last):
...
if not c.fetchone()[0] is None:
TypeError: 'NoneType' object is not subscriptable
Как же мне узнать, вернул что-то запрос или нет?



Офлайн

#2 Ноя. 3, 2011 13:07:56

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

непонятки с типами, с None

whitehat
Как же мне узнать, вернул что-то запрос или нет?
на этапе разработки - как минимум - завернуть в try - except
а так-то - почитать dbapi2



Офлайн

#3 Ноя. 3, 2011 13:34:02

whitehat
От:
Зарегистрирован: 2011-11-03
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

непонятки с типами, с None

вроде читал, там как раз написано, что int возвращается как long. При этом print тоже говорит, что вернулся long… почему же нельзя сравнить long с None?

 if not type(c.fetchone()[0]) is None:
даёт ту же ошибку….

Понимаю, что чего-то не понимаю, сделал специально тест:
                        a = long(10)
print type(a)
print a
if not a is None:
print "yes"
else:
print "no"
print type(c.fetchone()[0])
print c.fetchone()[0]
if not c.fetchone()[0] is NoneType:
age = int(c.fetchone()[0]) + 1
else:
age = 1
ошибка:
<type 'long'>
10
yes
<type 'long'>
Traceback (most recent call last):
...
print c.fetchone()[0]
TypeError: 'NoneType' object is not subscriptable
Как так - тип один и тот же <type ‘long’> , в первом случае всё ОК, во втором - ошибка?
UPD:
уже разобрался.
                a = c.fetchone()[0]
if not a is None:
age = a + 1
else:
age = 1
так работает :) понял свою ошибку, спасибо



Отредактировано (Ноя. 3, 2011 13:53:24)

Офлайн

#4 Ноя. 3, 2011 13:53:32

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

непонятки с типами, с None

Насколько я понимаю метод fetchone() возвращает None. А вы пытаетесь обратиться к нему как к списку и взять его нулевой элемент. Поэтому собственно до “is None” дело не доходит.



Офлайн

#5 Ноя. 3, 2011 14:09:47

whitehat
От:
Зарегистрирован: 2011-11-03
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

непонятки с типами, с None

Soteric
Насколько я понимаю метод fetchone() возвращает None. А вы пытаетесь обратиться к нему как к списку и взять его нулевой элемент. Поэтому собственно до “is None” дело не доходит.
угу, сразу 2 ошибки - и с БД неправильно работал, и проверял неправильно.



Офлайн

#6 Ноя. 4, 2011 04:07:53

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

непонятки с типами, с None

    a = c.fetchone()[0]
age = a + 1 if a != None else 1



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version