Comments 26
Насчёт потребления памяти к 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
При работе с обычным словарём пришлось бы постоянно проверять, существует ли ключ, и инициализировать несуществующие ключи вручную.
Не обязательно, у словарей есть метод 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}
new = {}
for key, value in data:
group = new.setdefault(key, []) # key might exist already
group.append(value)
Статью надо было назвать — "три полезных для датасайнтистов <\b> функции из библиотеки ..."
Справедливости ради, не только для них упомянутое полезно может быть. Но сам текст прямой речь именно про дэйтасцайнс, что есть то есть.
Первые 2 проблемы решаются из коробки.
У встроенных словарей есть метод __missing__
который может обрабатывать промахи в словаре:
class MyDict(dict):
def __missing__(self, key):
print("Oh no")
return 123
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'
from collections import OrderedDict
особенно удобен для работы с JSON файлами, чтобы сохранить внутренний порядок элементов
Завидую тем, кто может писать только для третьего питона
До 1.1 2020 рукой подать а после апреля можно расслабиться https://www.python.org/dev/peps/pep-0373/
для 2.7 и для 3.0-3.5 порядок ключей различный даже при одинаковом seedʼе.
Самый полезный модуль стандартной библиотеки Python, о котором все постоянно забывают