Форум сайта python.su
1
Столкнулся с такой проблемой:
Надо вернуть параметр, который спрятан глубоко в словаре. Если обращаться напрямую, вылезает за 80 символов. Через бэк слэш:
def return_something(some_dict) return some_dict['very_long_key']['another_very_long_key'] \ ['the_longest_key']
Офлайн
25
Можно извернутся как-то так:
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')
Офлайн
1
Спасибо. Интересный вариант.
Но я наверное плохо с акцентировал внимание на том, что ключи словаря сами по себе имеют длинные названия. Таким образом все равно не очень красиво будет выглядеть.
Хотя в принципе нормально. Но а без доп функций и бэк слэша это никак?
Отредактировано prokoptsev (Март 13, 2013 15:06:43)
Офлайн
25
Так, чтобы вообще избежать ввода длинных ключей - наврятли, если вам не удобно пользоваться такими ключами - то в чем проблема их сократить?
Офлайн
1
Мопед ключи не мои, я только с ними работаю
Офлайн
568
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()
Офлайн
173
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']
Офлайн
1
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)
Офлайн
-36
Скобки рулят?
Офлайн
1
krishnarama
Скобки рулят?
Офлайн