Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 27, 2014 00:01:28

in
Зарегистрирован: 2013-09-11
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое создание свойств у объекта

Я сортирую некий список карт, мне необходимо распихать данные этих карт по массивам в зависимости от того к какой книге принадлежат эти карты. Каждая такая карта хранит ссылку на свою книгу, поэтому я могу по айдишнику вычислить в какой массив мне нужно запихнуть ту или иную карту. Вот код:

 books = {}
for item in items:
            itemData = {}
            itemData['id'] = item.id
            itemData['title'] = item.card.title
            itemData['description'] = item.card.description
            book_id = str(item.card.book.id)
            if books[book_id]  == None:
                books[book_id] = {}
                books[book_id]['title'] = item.card.book.title
                books[book_id]['description'] = item.card.book.description
                books[book_id]['cards'] = []
            books[book_id]['cards'].append (itemData)

На строчке
 if books[book_id]  == None:
он выкидывает KeyError. в двух словах мне требуется убедится существует ли уже отдельный массив который доступен как свойство объекта books и если существует то просто запихнуть в него карту если нет, то создать этот массив.

Отредактировано in (Дек. 27, 2014 00:02:41)

Офлайн

#2 Дек. 27, 2014 01:03:54

in
Зарегистрирован: 2013-09-11
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое создание свойств у объекта

Напишу решение, мне пришлось написать отдельный метод. Если есть что-то элегантнее отпишитесь ниже:

  if hasAttr(books, book_id) == False:
#someCode

def hasAttr (obj, attr):
try:
obj[attr]
return True
except AttributeError:
return False
except KeyError:
return False

Офлайн

#3 Дек. 27, 2014 03:08:51

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

Динамическое создание свойств у объекта

in
выкидывает KeyError
if book_id not in books:



Офлайн

#4 Дек. 27, 2014 03:28:13

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Динамическое создание свойств у объекта

Чтобы проверить присутствует ли ключ в словаре:

>>> my_dict = {'a': 1, 'b': 2}
>>> 'a' in my_dict
True
>>> 'c' in my_dict
False
Чтобы получить какое-то значения из словаря по ключу или None/дефолтное значение, есть метод get:
>>> print(my_dict.get('a'))
1
>>> print(my_dict.get('c'))
None
>>> print(my_dict.get('c', 'default value'))
default value
>>>
Также правила хорошего тона - делать проверку на None при помощи оператора is, а не равенством.

Потому вашу проверку:
if books[book_id]  == None
Можно заменить на:
if book_id not in books
Или, если ключ может присутствовать в словаре и содержать None:
if books.get(book_id) is None:

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version