
Python 3 существует уже какое-то время и довольно много разработчиков, особенно те, кто только начинает свой путь в Python, уже используют эту версию языка. Несмотря на то, что множество новых возможностей широко используются, похоже, что некоторые остались за кадром. В этой статье я расскажу о трех наименее известных, но полезных, возможностях. Я знаю о них из других языков и они делают Python 3 классным.
Данная статья является переводом 3 Neglected Features in Python 3 That Everyone Should Be Using.
Перечисления
Перечисления я много использовал в Java и Swift. Продолжаю их использовать теперь и в Python.
Объявление перечисления в Python очень просто сделать и это было возможно и до третьей версии (хотя и с ограничениями):
from enum import Enumclass State(Enum): AIR = 0 LAND = 1 SEA = 2 myState = State.AIR# Выводит 0print(myState.value)# Выводит AIRprint(myState.name)
В коде выше перечисление вводится путем объявления класса, наследованного от
Enum
. А далее просто описываются все
нужные состояния. В моем случае: AIR
,
LAND
и SEA
.Функциональность, которая была добавлена в Python 3 возможность использовать
.value
и .name
. Они
позволяют получить число и строку соответствующие перечислению.Например, вывод значения
State.LAND.name
будет
LAND
.Перечисления полезны в коде, когда вы хотите иметь некоторые текстовые идентификаторы для констант. Например, вместо сравнения состояния с 0 или 1 гораздо показательнее сравнивать с
State.MOVING
или State.STATIONARY
.
Константы могут меняться и если кто-то посмотрит код позже, то
слово MOVING
даст гораздо больше понимания, чем 0. В
результате сильно повышается читабельность кода.Больше информации можно найти в официальной документации Python 3 по Enum.
Форматирование
Добавленные в версии 3.6,
fstrings
это мощное средство
форматирования текста. Они позволяют создавать гораздо более
читабельный и безошибочный код (чем я наслаждаюсь после перехода из
Java). Это лучше, чем format
, который использовался
ранее в Python. Вот пример использования format
:
name = 'Михаил'blog_title = 'codeatcpp.com'# Привет, меня зовут Михаил и я пишу в своем блоге codeatcpp.com.a = "Привет, меня зовут {} и я пишу в своем блоге {}.".format(name, blog_title)
Легко заметить пустые фигурные скобки внутри строки и после список с названиями переменных в определенном порядке.
Теперь посмотрим на такой же код, но с использованием
fstring
более читабельный и очень похожий на способ
форматирования в Swift.
name = 'Михаил'blog_title = 'codeatcpp.com'# Привет, меня зовут Михаил и я пишу в своем блоге codeatcpp.com.a = f"Привет, меня зовут {name} и я пишу в своем блоге {blog_title}."
Чтобы получить такую аккуратную строку, нужно всего лишь поместить букву
f
перед кавычками, и затем вместо пустых скобок
можно сразу писать названия переменных или данные прямо в строке.
Поскольку переменные пишутся прямо в строке, нет необходимости
считать количество элементов и следить в каком порядке располагать
переменные в конце. Они просто находятся сразу там, где нужны их
значения.Использование
fstring
дает более читабельный и более
простой в поддержке код, чем использование классических
подходов.Классы данных
Классы данных может быть более непонятная тема, чем предыдущие, поэтому потребует чуть больше пояснений. Классы данных это что-то, что мне очень понравилось в языке Kotlin, поэтому я люблю их использовать также и в Python.
Класс данных это класс, единственная цель которого хранить данные. Класс содержит переменные, которые можно читать и писать, но не имеет никакой дополнительной логики.
Представьте, что у вас есть программа, в которой вам нужно передавать строку и массив чисел между разными классами. У вас могут быть методы вроде
pass(str, arr)
, но гораздо
удобнее сделать класс, который содержит строку и массив в качестве
единственных членов класса.Использование класса данных лучше показывает что вы пытаетесь сделать и также упрощает создание юнит-тестов.
Пример ниже показывает простой класс данных, который представляет собой трехмерный вектор, но он может быть легко расширен для представления любой комбинации различных данных:
from dataclasses import dataclass# Определяем класс данных@dataclassclass Vector3D: x: int y: int z: int # Создаем векторu = Vector3D(1,1,-1)# Выводит: Vector3D(x=1, y=1, z=-1)print(u)
Здесь легко заметить, что определение класса данных очень похоже на определение обычного класса, за исключением того, что используется декоратор
@dataclass
и затем каждое поле определяется
в виде имя: тип
.Хотя функциональность созданного
Vector3D
сильно
ограничена, суть использования класса данных в том, чтобы повысить
эффективность и уменьшить количество ошибок в коде. Ведь гораздо
лучше передавать в качестве параметра Vector3D
, чем
набор переменных типа int
.Больше информации про декоратор
@dataclass
можно найти
в официальной документации Python 3.Заключение
Дайте знать в комментариях, если вы попробовали эти новые возможности. Интересно будет услышать про новые сценарии их использования. Удачного кодирования!