Найти - Пользователи
Полная версия: PEP8 и словари большой вложенности
Начало » Python для новичков » PEP8 и словари большой вложенности
1 2
prokoptsev
Столкнулся с такой проблемой:
Надо вернуть параметр, который спрятан глубоко в словаре. Если обращаться напрямую, вылезает за 80 символов. Через бэк слэш:
def return_something(some_dict)
    return some_dict['very_long_key']['another_very_long_key'] \
        ['the_longest_key']
так уродски смотрится, к тому же встроенный модуль проверки pep8 тоже ругается.
Вопрос. Как быть? Подскажите кто как поступает в подобной ситуации.
s0rg
Можно извернутся как-то так:
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')
prokoptsev
Спасибо. Интересный вариант.
Но я наверное плохо с акцентировал внимание на том, что ключи словаря сами по себе имеют длинные названия. Таким образом все равно не очень красиво будет выглядеть.

Хотя в принципе нормально. Но а без доп функций и бэк слэша это никак?
s0rg
Так, чтобы вообще избежать ввода длинных ключей - наврятли, если вам не удобно пользоваться такими ключами - то в чем проблема их сократить?
prokoptsev
Мопед ключи не мои, я только с ними работаю
FishHook
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()
reclosedev
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']
prokoptsev
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']
Вот, первый способ самое то! Во втором использовать временные переменные что бы только зафиксировать значения не очень наверное хорошо.
Всем спасибо за советы.
krishnarama
Скобки рулят?
prokoptsev
krishnarama
Скобки рулят?

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

Так что, скобки рулят
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB