Уведомления

Группа в Telegram: @pythonsu

#1 Март 13, 2013 14:11:05

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

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

Столкнулся с такой проблемой:
Надо вернуть параметр, который спрятан глубоко в словаре. Если обращаться напрямую, вылезает за 80 символов. Через бэк слэш:

def return_something(some_dict)
    return some_dict['very_long_key']['another_very_long_key'] \
        ['the_longest_key']
так уродски смотрится, к тому же встроенный модуль проверки pep8 тоже ругается.
Вопрос. Как быть? Подскажите кто как поступает в подобной ситуации.

Офлайн

#2 Март 13, 2013 14:40:29

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

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

Можно извернутся как-то так:

test_d = {
        'key1': {
            'key2': {
                'key3': 'value1'
            }
        },
        'keya': {
            'keyb': {
                'keyc': 'value2'
            }
        }
    }
def key_gettter(d, key):
    for k in key.split('.'):
        if isinstance(d[k], dict):
            d = d[k]
        else:
            return d[k]
    else:
        raise KeyError(key)
print key_gettter(test_d, 'key1.key2.key3')
print key_gettter(test_d, 'keya.keyb.keyc')
print key_gettter(test_d, 'key1.keyb')

Офлайн

#3 Март 13, 2013 15:05:56

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

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

Спасибо. Интересный вариант.
Но я наверное плохо с акцентировал внимание на том, что ключи словаря сами по себе имеют длинные названия. Таким образом все равно не очень красиво будет выглядеть.

Хотя в принципе нормально. Но а без доп функций и бэк слэша это никак?

Отредактировано prokoptsev (Март 13, 2013 15:06:43)

Офлайн

#4 Март 13, 2013 15:16:12

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

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

Так, чтобы вообще избежать ввода длинных ключей - наврятли, если вам не удобно пользоваться такими ключами - то в чем проблема их сократить?

Офлайн

#5 Март 13, 2013 15:22:15

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

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

Мопед ключи не мои, я только с ними работаю

Офлайн

#6 Март 13, 2013 15:30:29

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

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

class MyDict(dict):
    
    def __init__(self, value={}):
        self.update(value)
    def __getattr__(self, name):
        
        return self[name]
        
    def __setattr__(self, name, value):
        if isinstance(value, dict):
            value=MyDict(value)
        self[name]=value
           
    
dct=MyDict()
dct.update(yy=56)
dct['zz']=56
dct.aa=98
dct.aa={'F':5, 'G':78}
print dct.aa.F
dct.aa.z={'H':78,'O':90}
print dct.aa.z.O
print dct
s=raw_input()



Офлайн

#7 Март 13, 2013 17:16:56

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

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

prokoptsev
Хотя в принципе нормально. Но а без доп функций и бэк слэша это никак?
Еще можно так
def return_something(some_dict):
    return (some_dict['very_long_key']
                     ['another_very_long_key']
                     ['the_longest_key'])
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']

Офлайн

#8 Март 13, 2013 18:38:19

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'])
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 (Март 13, 2013 18:38:52)

Офлайн

#9 Март 16, 2013 02:35:44

krishnarama
Зарегистрирован: 2013-02-27
Сообщения: 51
Репутация: +  -36  -
Профиль   Отправить e-mail  

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

Скобки рулят?

Офлайн

#10 Март 16, 2013 08:41:54

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

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

krishnarama
Скобки рулят?

Я пользуюсь pep8 и для проверки стиля кода и там есть правило, что не допускается пробелов между скобок в которых идет обращение к индексам. При разделении их через бэкслэш, проблема не уходит, так как перенос на другую строку оставляет интервал между элементами обращения по ключам словаря.
Если пользоваться предложенными вариантами, что в любом случае длина ключей большая и перенос неизбежен (мне очень нравится когда строки кода не превышают 80 символов). А круглые скобки позволяют неявное объединение строк кода.

Так что, скобки рулят

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version