Форум сайта python.su
В Perl'е есть такой удобный оператор //, обычно он используется для задания дефолтных значений, в питоне можно для параметров функций задавать дефолтные значения, но это не подходит для сложных структур (например когда нужен дефолт для отдельных полей).
Пример того как это выглядит в перле:
my $var = $struct{key1}{key2} // 'defaul_value';
Отредактировано worldmind (Янв. 5, 2017 08:00:26)
Офлайн
В словаре можно использовать метод get() вместо квадратных скобок, у него есть значение по умолчанию.
>>> {}.get('x') >>> {}.get('x', 'no') 'no' >>>
>>> try: ... x = {}['a']['b']['c'] ... except KeyError: ... x = 1 ... >>> x 1 >>>
Отредактировано py.user.next (Янв. 5, 2017 08:19:02)
Офлайн
Да, я тут подумал что надо этот try обернуть в свой оператор и будет что-то похожее
Офлайн
worldmindесли это можно сделать нормальным способом
Да, я тут подумал что надо этот try обернуть в свой оператор и будет что-то похожее
Офлайн
from infix import shift_infix as infix @infix def exist_or(value, default_value): try: result = value except KeyError: result = default_value return result
>>> from existor import exist_or >>> struct = {'key1': {'key2': 'aaa'}} >>> var = struct['key1']['key2'] <<exist_or>> '7' >>> var 'aaa' >>> var = struct['key1']['key3'] <<exist_or>> '7' Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'key3'
Отредактировано worldmind (Янв. 5, 2017 08:53:40)
Офлайн
d = {} x = d.get("a", {}).get("b", {}).get("c", 1)
Офлайн
FishHookВариант конечно, мой вариант выше можно доработать
from infix import shift_infix as infix @infix def exist_or(value_func, default_value): try: result = value_func() except KeyError: result = default_value return result
>>> from existor import exist_or >>> struct = {'key1': {'key2': 'aaa'}} >>> var = (lambda:struct['key1']['key2']) <<exist_or>> '7' >>> var 'aaa' >>> var = (lambda:struct['key1']['key3']) <<exist_or>> '7' >>> var '7'
Офлайн
Можно посмотреть в сторону https://docs.python.org/2/library/stdtypes.html?highlight=setdefault#dict.setdefault
>>> d = {} >>> d {} >>> val = d.setdefault('key', 'value') >>> val 'value' >>> d {'key': 'value'}
>>> from collections import defaultdict >>> d = defaultdict(list) >>> d defaultdict(<type 'list'>, {}) >>> d['list1'].append(1) >>> d defaultdict(<type 'list'>, {'list1': [1]}) >>> d['list1'].append(2) >>> d defaultdict(<type 'list'>, {'list1': [1, 2]})
Офлайн
worldmind
ну это как-то извращением попахивает, если хочется изобрести велосипед, то лучше от dict отнаследоваться.
Офлайн
ABKorotky
Правда, для рекурсивной инициализации не совсем подходит
d = defaultdict(lambda:defaultdict(list))
Офлайн