Многие разработчики, особенно новички, уже активно пишут на 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 здесь. Спасибо за чтение!
Перевод статьи Brett Fazio: 3 Neglected Features in Python 3 That Everyone Should Be Using
Комментарии