Я использую Python 3.7 в течение нескольких недель, поэтому для меня было шоком обнаружить, что он больше не является кандидатом на выпуск — это официально новый Python 3.
Путь от Python 2 до Python 3 был долгим и довольно пологим. Если вы действительно не смогли перейти на Python 3 по той или иной причине, то вам хорошо послужила текущая линия разработки Python 2. Но теперь достаточно. Python 3 является зрелым, и это подтверждается долгожданными, но не серьезными изменениями и дополнениями к Python 3.7. Это хорошо, потому что только скучающие программисты хотят язык, который развивается так быстро, что острые ощущения от попыток не отставать. Да, я полагаю, я говорю, что Python стареет.
Итак, что нового в 3.7?
Наиболее важным дополнением для среднего программиста является добавление классов данных. Иногда вы просто хотите создать класс, чтобы его можно было использовать для хранения данных. В других языках такой объект можно было бы назвать «структурой» или «типом записи». Java собирается получить классы данных, и у Kotlin они уже есть, например. Классы данных Python предоставляют вам декораторский способ создания классов, готовых к работе с данными. Вы просто добавляете @dataclass перед определением класса, а затем перечисляете все поля данных, которые хотите использовать. Каждое поле представляет собой имя переменной, за которым следует аннотация типа. Декоратор преобразует это в определение класса с подходящим __init__, чтобы вы могли правильно инициализировать поля при создании экземпляра. Вы также можете изменить способ создания полей с помощью вспомогательной функции поля. Что впечатляет, так это то, что этот дополнительный тип данных был реализован с использованием только Python.
Говоря об аннотациях типов, 3.7 добавляет прямые ссылки и повышает скорость работы. У меня смешанные чувства по поводу аннотаций типов. Они начинают быть полезными, например, когда вы описываете сигнатуру функции, но быстро становятся сложными и трудными для правильного понимания. Отсутствие необходимости иметь дело с дженериками и дисперсией является одним из преимуществ Python — добавление их обратно, даже в качестве дополнительной функции, не является очевидным улучшением.
Еще одной важной особенностью является возможность работы с атрибутами, определенными в модулях. Теперь вы можете использовать __getattr__ и __dir__ на модулях. Это логически делает модули похожими на «большие» классы, что более или менее соответствует их сути.
Меньшей особенностью, в том смысле, что ns меньше, чем ms, является повышенная точность пакета синхронизации. Теперь вы можете использовать функции в модуле времени, чтобы получить точность в наносекундах, возвращаемую в виде целого числа.
Теперь мы переходим к действительно небольшим улучшениям:
Порядок словаря теперь задается как часть языка, и итераторы работают в том порядке, в котором были добавлены объекты.
async и await-это ключевые слова, и если вы использовали переменную с любым из этих имен, вы заслуживаете проблемы, которая возникает.
Модуль asyncio был обновлен.
Новые контекстные переменные обеспечивают локальное хранилище потоков для асинхронных задач.
Новый API C для локального хранилища потоков.
Наконец, есть ускорения — вызов стандартной библиотеки происходит быстрее, вызовы методов-быстрее, а запуск-быстрее.
Python 3.7 уже вышел, и нет никаких веских причин не использовать его, и многие новые функции работают с 3.6.
Майк Джеймс недавно завершил работу над программистским Python: Objects & Attributes, первым томом в его программистском Python: Что-то совершенно другое. При подготовке этой книги он развил новую страсть к Python 3