Pull to refresh

Comments 26

Мм, named tuple c регулируемой мутабельностью и дефолтными значениями без кровотечения из глаз… Спасибо.

dataclasses вообще вкусная конфигурируемая штука.

А что насчет производтельности? Туплы очень легкие структуры

Насчёт потребления памяти к dataclasses в их нынешнем виде есть много претензий. NamedTuple они в этом по-прежнему уступают.
Проблему можно обойти, если использовать дополнительную обёртку вроде этой. Но какой смысл было так торопиться, чтобы непременно зарелизить эти dataclasses во чтобы то не стало в 3.7 без предварительного решения такого ключевого вопроса, как встроенная поддержка slots — от меня ускользает.

At least for the initial release, slots will not be supported. slots needs to be added at class creation time. The Data Class decorator is called after the class is created, so in order to add slots the decorator would have to create a new class, set slots, and return it. Because this behavior is somewhat surprising, the initial version of Data Classes will not support automatically setting slots.

https://www.python.org/dev/peps/pep-0557/#support-for-automatically-setting-slots

Murtagy Их минус в сравнении с кортежами — не юзают и почти что не умеют юзать __slots__ что для датакласов странно — и ошибиться легче и памяти больше расходуется.
C появлением 3.7 не мало вещей так же и сломалось, что держит не мало компаний от миграции с 3.6. А также не так уже и много разработчиков будут уделять внимание новым плюшкам ради обратной совместимости. Пруфа ради чего только стоят попытки делать код обратно совместимым с Python 2.7. Если люди идут даже на такое, то о dataclasses на ближайшие лет 5 можно забыть.
При работе с обычным словарём пришлось бы постоянно проверять, существует ли ключ, и инициализировать несуществующие ключи вручную.

Не обязательно, у словарей есть метод get
my_default_dict = dict()
for letter in 'the red fox ran as fast as it could':
    my_default_dict[letter] = my_default_dict.get(letter,0) + 1
print(my_default_dict)


Вывод:
{'a': 4, ' ': 8, 'c': 1, 'e': 2, 'd': 2, 'f': 2, 'i': 1, 'h': 1, 'l': 1, 'o': 2, 'n': 1, 's': 3, 'r': 2, 'u': 1, 't': 3, 'x': 1}
А еще есть setdefault

new = {}
for key, value in data:
    group = new.setdefault(key, []) # key might exist already
    group.append(value)

Статью надо было назвать — "три полезных для датасайнтистов <\b> функции из библиотеки ..."

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

Мне кажется, дата сайнтисты ванильным питоном не пользуются. Pandas в руки и вперёд.
Первые 2 проблемы решаются из коробки.
Pandas часто слишком медленный в текущей реализации, поэтому и чистый Python и Numpy массивы/матрицы очень даже в ходу у дата-сатанистов. Можно убедиться, посмотрев кернелы на Kaggle.
Так будет короче
dictionary.get('not_found_key', 123)

Разное ведь — missing для личной обработки отсутствия элемента в своём классе, get со вторым параметром для стандартных.

Этот метод работает только с оператором [] и предназначен для других вещей — создания собственных классов словарей с видоизмененной логикой d[key] без оверхеда:


>>> class Counter(dict):
...     def __missing__(self, key):
...         return 0
>>> c = Counter()
>>> c['red']
0
>>> c['red'] += 1
>>> c['red']
1

>>> class Default(dict):
...     def __missing__(self, key):
...         return key
...
>>> '{name} was born in {country}'.format_map(Default(name='Guido'))
'Guido was born in country'
Спасибо! Информации по стандартной библиотеке очень не хватает, особенно на русском очень сложно что то найти. #sarcasm
Да ну ладно, вещи реально полезные, сам через их «открытие» проходил когда-то как начинающий дата-сайентист :)
from collections import OrderedDict

особенно удобен для работы с JSON файлами, чтобы сохранить внутренний порядок элементов
Если не ошибаюсь, обычный dict уже сохраняет порядок примерно с версии 3.6.

Завидую тем, кто может писать только для третьего питона

Причём для >=3.6 :)
для 2.7 и для 3.0-3.5 порядок ключей различный даже при одинаковом seedʼе.
Only those users with full accounts are able to leave comments. Log in, please.