Многие разработчики, особенно новички, уже активно пишут на Python 3. И хотя в этой версии появилось множество новых функций, многие из них неизвестны или применяются редко. Я расскажу о трёх таких — менее популярных, но очень полезных. С этими функциями я познакомился в других языках и полюбил их, и я считаю, что они действительно делают Python 3 лучше.

Перечисления

Я часто работал с перечислениями в Java и Swift, также продолжаю делать это в Python.

Объявление перечисления в Python очень просто и работает в версиях до 3 (хотя и с ограниченной функциональностью):

from enum import Enum

class State(Enum):
  AIR = 0
  LAND = 1
  SEA = 2
  
myState = State.AIR

# Вывод: 0
print(myState.value)
# Вывод: AIR
print(myState.name)

В приведенном выше коде видно, что для получения перечисления нужно сначала объявить класс, а затем превратить его в подкласс Enum. Потом вы просто определяете каждое из состояний (State) в следующих строках. В моем случае были доступны AIR, LAND и SEA.

Функциональность, добавленная в Python 3,  —  это возможность вызовов .value и .name. С их помощью можно получить связанное с состоянием целочисленное значение или строку.

В приведенном выше коде при выводе State.LAND.name возвращается значение LAND, так что теперь функционал охватывает больше, чем просто получение целого числа.

Перечисления пригодятся для получения описания для констант. Например, вместо того, чтобы проверять, равно ли состояние 0 или 1, гораздо лучше узнать, является ли оно State.MOVING или State.STATIONARY, ведь константы могут изменяться. Если кто-то посмотрит на ваш код, MOVING для него будет иметь больше смысла, чем 0. В результате значительно улучшается читаемость.

Для получения дополнительной информации ознакомьтесь с официальной документацией Python 3 по Enum здесь.

Форматирование

Добавленные в Python 3.6 fstrings  —  отличный способ форматирования текста. Они обеспечивают гораздо большую читабельность и менее подвержены ошибкам в отличие от format, ранее используемого в Python. Вот пример с format:

name = 'Brett'
blog_title = 'Medium'

# Hi, my name is Brett and I am writing on my Medium blog.
a = "Hi, my name is {} and I am writing on my {} blog.".format(name, blog_title)

Как видите, у нас есть пустые скобки в строке, а затем мы перечисляем имена переменных по порядку.

Теперь рассмотрим пример того же кода с помощью fstring. Он гораздо более читабелен и похож на форматирование строки в Swift.

name = 'Brett'
blog_title = 'Medium'

# Hi, my name is Brett and I am writing on my Medium blog.
a = f"Hi, my name is {name} and I am writing on my {blog_title} blog."

Чтобы сделать строку чище, мы просто пишем букву f перед кавычками, а затем вместо того, чтобы оставлять скобки пустыми, помещаем переменные или данные непосредственно в них. Поскольку переменные записываются в самих скобках, не нужно подсчитывать количество элементов, чтобы выяснить, где находится каждая из них — переменные существуют именно там, куда помещаются.

Классы данных

Классы данных, возможно, ещё более скрытая возможность, поэтому объясню кратко. Мне очень нравятся они в Kotlin, поэтому я предпочитаю работать с ними в Python.

Класс данных  —  это класс, единственной целью которого является хранение данных. Класс будет иметь переменные, которые могут быть доступны и записаны, но поверх данных нет никакой логики.

Представьте, что у вас есть программа, и вы передаете строку и массив чисел между различными классами. Вы могли бы просто использовать такие методы, как pass(str, arr), но лучшим подходом было бы создание класса данных, который содержит только строку в виде поля и массива. С классом данных ваши действия станут понятнее, а выполнять модульное тестирование будет проще.

Я приведу пример, как создать простой класс данных, представляющий трехмерный вектор (он может быть легко расширен для представления любой комбинации различных данных):

from dataclasses import dataclass

# Определение класса данных 
@dataclass
class Vector3D:
    x: int
    y: int
    z: int
      
# Создание вектора
u = Vector3D(1,1,-1)

# Вывод: Vector3D(x=1, y=1, z=-1)
print(u)

Как видите, определение класса данных очень похоже на объявление обычного класса, за исключением того, что мы используем @dataclass перед ним, а затем каждое поле объявляется как name: type.

Хотя функциональность созданного нами Vector3D ограничена, смысл класса данных заключается только в том, чтобы повысить эффективность и уменьшить количество ошибок в коде. Намного лучше передать объект vector3d, чем переменные int.

Для получения более подробной информации о @dataclass ознакомьтесь с официальной документацией Python 3 здесь. Спасибо за чтение!

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Brett Fazio: 3 Neglected Features in Python 3 That Everyone Should Be Using

Предыдущая статьяМоделирование связей графа в DynamoDB
Следующая статьяПять шагов к красивому терминалу, которым вам понравится пользоваться