объект типа «NoneType» не имеет ошибки len()

Я вижу странное поведение в этом коде:

images = dict(cover=[],second_row=[],additional_rows=[])

for pic in pictures:
    if len(images['cover']) == 0:
        images['cover'] = pic.path_thumb_l
    elif len(images['second_row']) < 3:
        images['second_row'].append(pic.path_thumb_m)
    else:
        images['additional_rows'].append(pic.path_thumb_s)

Мое приложение web2py дает мне эту ошибку:

if len(images['cover']) == 0:
TypeError: object of type 'NoneType' has no len()

Я не могу понять, что в этом не так. Может быть, проблема с масштабом?


person dmmd    schedule 05.08.2012    source источник
comment
Вы запрашиваете длину переменной, которая содержит None. None — это специальное значение (типа NoneType), которое не имеет длины. Прежде чем проверять длину чего-либо, сначала убедитесь, что оно не имеет значения None.   -  person Eric Leschinski    schedule 18.05.2015


Ответы (3)


Вы назначаете что-то новое для images['cover']:

images['cover'] = pic.path_thumb_l

где pic.path_thumb_l равно None в какой-то момент вашего кода.

Вы, вероятно, хотели добавить вместо этого:

images['cover'].append(pic.path_thumb_l)
person Martijn Pieters    schedule 05.08.2012

твоя проблема в том, что

if len(images['cover']) == 0:

проверяет ДЛИНУ значения images['cover'], что вы хотели сделать, это проверить, имеет ли оно значение.

сделайте это вместо этого:

if not images['cover']:

person Inbar Rose    schedule 05.08.2012
comment
На самом деле это произошло из-за присвоения некоторого None изображениям ['cover'] (как указал Мартджин). Но спасибо! - person dmmd; 05.08.2012
comment
в своем посте вы сказали, что эта строка if len(images['cover']) == 0: дала вам ошибку... - person Inbar Rose; 05.08.2012
comment
в любом случае, вы должны вместо этого изменить свой код на if not images['cover']:, поскольку, если длина не равна 0, она уже будет иметь значение, таким образом, она более питоническая :) - person Inbar Rose; 05.08.2012
comment
Да. Во второй итерации внутри for тип images['cover'] был None, так как первая итерация присвоила ему некоторое значение None. - person dmmd; 05.08.2012
comment
О, да, это правда. Сделаю это! Спасибо :) - person dmmd; 05.08.2012

При первом назначении: images['cover'] = pic.path_thumb_l он заменяет значение пустого списка, изначально сохраненного в images['cover'], значением pic.path_thumb_l, которое равно None.

Возможно, ваш код в этой строке должен быть images['cover'].append(pic.path_thumb_l)

person Medardo Rodriguez    schedule 05.08.2012