Уведомления

Группа в Telegram: @pythonsu

#1 Март 16, 2013 08:57:28

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

PEP8 и словари большой вложенности

Если обращение к элементам дерева идёт по константным индексам, что-то нетак в датском королевстве.
Но если нужно, вот ещё вариант:

def return_something(some_dict)
    l0 = 'very_long_key'
    l1 = 'another_very_long_key'
    l2 = 'the_longest_key'
    return some_dict[l0][l1][l2]

Офлайн

#2 Март 16, 2013 09:25:52

prokoptsev
Зарегистрирован: 2012-07-17
Сообщения: 13
Репутация: +  1  -
Профиль   Отправить e-mail  

PEP8 и словари большой вложенности

Shaman
Но если нужно, вот ещё вариант:
Подобный вариант уже предлагали.
reclosedev
def return_something2(some_dict):
    some_meaningful_name = some_dict['very_long_key']
    which_self_documents_code = some_meaningful_name['another_very_long_key']
    return which_self_documents_code['the_longest_key']

И если бы имена ключей использовались еще где-нибудь, то ваш вариант имеет место быть, но в моем случае это будут одноразовые константы, что как-то не очень правильно.

Отредактировано prokoptsev (Март 16, 2013 09:26:13)

Офлайн

#3 Март 16, 2013 09:36:10

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

PEP8 и словари большой вложенности

prokoptsev
И если бы имена ключей использовались еще где-нибудь, то ваш вариант имеет место быть, но в моем случае это будут одноразовые константы, что как-то не очень правильно.
L0 = 'very_long_key'
L1 = 'another_very_long_key'
L2 = 'the_longest_key'
def return_something(some_dict)
    return some_dict[L0][L1][L2]
а так будет правильнее?

Отредактировано Shaman (Март 16, 2013 09:36:59)

Офлайн

#4 Март 16, 2013 10:02:00

prokoptsev
Зарегистрирован: 2012-07-17
Сообщения: 13
Репутация: +  1  -
Профиль   Отправить e-mail  

PEP8 и словари большой вложенности

Я не гуру питона, по этому пусть меня поправят если я не правильно говорю.

Когда вы определяете константу, вы выделяешь в памяти под нее место. В данном случае вы выделяете 3 текстовые константы в пространстве имен, что бы обратиться по ним к параметру в словаре в одном единственном месте.
Другое дело, если бы вы использовали константу в нескольких местах. Например так:

L0 = 'very_long_key'
L1 = 'another_very_long_key'
L2 = 'the_longest_key'
def return_something_1(some_dict)
    return some_dict[L0][L1][L2]
def return_something_2(some_dict_reverse)
    return some_dict[L2][L1][L0]

В общем, вариант со скобками мне понравился больше так как не надо писать функций, оберток и определять констант. Такой способ проходит проверку на pep8 и, на мой взгляд, соответствует дзену питона:
...Явное лучше, чем неявное...
...Простое лучше, чем сложное...
...Читаемость имеет значение...

Офлайн

#5 Март 16, 2013 16:06:44

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

PEP8 и словари большой вложенности

Если в теле функции в локальную переменную записывается какое-то промежуточное содержимое, то это совсем не константа, эта переменная умрет с отработкой функции. Очень часто случается, что так и нужно делать, чтобы получить читаемый код.

Офлайн

#6 Март 16, 2013 16:19:37

prokoptsev
Зарегистрирован: 2012-07-17
Сообщения: 13
Репутация: +  1  -
Профиль   Отправить e-mail  

PEP8 и словари большой вложенности

А какой на ваш взгляд код более читабельный и более правильный?
Первый вариант:

reclosedev
def return_something(some_dict):
    return (some_dict['very_long_key']
                     ['another_very_long_key']
                     ['the_longest_key'])
Второй вариант:
Shaman
def return_something(some_dict)
    l0 = 'very_long_key'
    l1 = 'another_very_long_key'
    l2 = 'the_longest_key'
    return some_dict[l0][l1][l2]

Офлайн

#7 Март 16, 2013 17:24:05

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

PEP8 и словари большой вложенности

я в подобных случаях делаю как в первом варианте. Все ясно и читаемо.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version