Пропустить до содержимого

Как использовать и исправить named tuple в Python?

CodeMDD.io

Напишите Python-код с помощью named tuple

Создание классов Tuple-подобных с помощью named tuple()

Named tuple - это класс, предоставляемый модулем collections в Python, который позволяет создавать неизменяемые типы последовательностей с возможностью обращаться к их значениям с использованием понятных имен полей и с помощью точечной нотации вместо неясных целочисленных индексов.

{% highlight python %} from collections import namedtuple

Создайте класс Person с полями name и age

Person = namedtuple(“Person”, [“name”, “age”])

Создайте экземпляр класса Person

person = Person(“John”, 30)

Обратитесь к значениям полей экземпляра класса с помощью точечной нотации

print(person.name) # Вывод: John print(person.age) # Вывод: 30 {% endhighlight %}

В приведенном выше примере мы создали класс Person с полями name и age. Затем мы создали экземпляр класса Person и обратились к значениям полей с помощью точечной нотации. Выводом на экран будет имя “John” и возраст “30”.

Использование дополнительных функций классов named tuple

Named tuple предоставляет несколько полезных функций, которые могут быть полезны при работе с классами. Рассмотрим некоторые из них.

Создание экземпляров классов named tuple из итерируемых объектов

{% highlight python %} from collections import namedtuple

Создайте класс Point с полями x и y

Point = namedtuple(“Point”, [“x”, “y”])

Создайте список итерируемых объектов

data = [(1, 2), (3, 4), (5, 6)]

Создайте список экземпляров класса Point из списка итерируемых объектов

points = [Point(*d) for d in data]

Выведите созданные экземпляры класса Point

for point in points: print(point) {% endhighlight %}

В этом примере мы создали класс Point с полями x и y. Затем мы создали список итерируемых объектов, содержащих координаты точек. С помощью спискового включения мы создали список экземпляров класса Point из списка итерируемых объектов. Затем мы вывели на экран созданные экземпляры класса Point.

Выходные данные на экране будут следующими:

Point(x=1, y=2)
Point(x=3, y=4)
Point(x=5, y=6)

Преобразование экземпляров классов named tuple в словари

{% highlight python %} from collections import namedtuple

Создайте класс Point с полями x и y

Point = namedtuple(“Point”, [“x”, “y”])

Создайте экземпляр класса Point

point = Point(1, 2)

Преобразуйте экземпляр класса Point в словарь

point_dict = point._asdict()

Выведите преобразованный словарь

print(point_dict) {% endhighlight %}

В этом примере мы создали класс Point с полями x и y. Затем мы создали экземпляр класса Point с координатами (1, 2). Затем мы преобразовали экземпляр класса Point в словарь с помощью метода _asdict(). Затем мы вывели на экран преобразованный словарь.

Выходные данные на экране будут следующими:

{'x': 1, 'y': 2}

Замена полей в существующих экземплярах классов named tuple

{% highlight python %} from collections import namedtuple

Создайте класс Point с полями x и y

Point = namedtuple(“Point”, [“x”, “y”])

Создайте экземпляр класса Point

point = Point(1, 2)

Замените поле x на новое значение

point = point._replace(x=3)

Выведите замененный экземпляр класса Point

print(point) {% endhighlight %}

В этом примере мы создали класс Point с полями x и y. Затем мы создали экземпляр класса Point с координатами (1, 2). Затем мы заменили значение поля x на новое значение, используя метод _replace(). Затем мы вывели на экран замененный экземпляр класса Point.

Выходные данные на экране будут следующими:

Point(x=3, y=2)

Написание Pythonic-кода с помощью named tuple

Named tuple позволяет создавать Pythonic-код, который делает ваш код более читаемым и понятным. Рассмотрим некоторые примеры.

Использование имен полей вместо индексов

{% highlight python %} from collections import namedtuple

Создайте класс Point с полями x и y

Point = namedtuple(“Point”, [“x”, “y”])

Создайте экземпляр класса Point

point = Point(1, 2)

Обратитесь к полям с использованием имен вместо индексов

print(point.x) # Вывод: 1 print(point.y) # Вывод: 2 {% endhighlight %}

В этом примере мы создали класс Point с полями x и y. Затем мы создали экземпляр класса Point и обратились к значениям полей с использованием имен полей вместо индексов. Выводом на экран будет значение x “1” и значение y “2”.

Возврат нескольких именованных значений из функций

{% highlight python %} from collections import namedtuple

Создайте класс Person с полями name и age

Person = namedtuple(“Person”, [“name”, “age”])

Определите функцию, которая возвращает экземпляр класса Person

def get_person(): return Person(“John”, 30)

Вызовите функцию и получите именованные значения name и age

person = get_person() print(person.name) # Вывод: John print(person.age) # Вывод: 30 {% endhighlight %}

В этом примере мы создали класс Person с полями name и age. Затем мы определили функцию get_person(), которая возвращает экземпляр класса Person. Затем мы вызываем функцию get_person() и получаем именованные значения name и age. Выводом на экран будет имя “John” и возраст “30”.

Уменьшение количества аргументов функций

{% highlight python %} from collections import namedtuple

Создайте класс Point с полями x и y

Point = namedtuple(“Point”, [“x”, “y”])

Определите функцию, которая принимает экземпляр класса Point в качестве аргумента

def calculate_distance(point): return (point.x ** 2 + point.y ** 2) ** 0.5

Создайте экземпляр класса Point

point = Point(3, 4)

Вызовите функцию и передайте экземпляр класса Point в качестве аргумента

distance = calculate_distance(point) print(distance) # Вывод: 5.0 {% endhighlight %}

В этом примере мы создали класс Point с полями x и y. Затем мы определили функцию calculate_distance(), которая принимает экземпляр класса Point в качестве аргумента и вычисляет расстояние от начала координат до точки. Затем мы создаем экземпляр класса Point со значениями x = 3 и y = 4. После этого мы вызываем функцию calculate_distance() и передаем экземпляр класса Point в качестве аргумента. Выводом на экран будет расстояние “5.0”.

Чтение табличных данных из файлов и баз данных

{% highlight python %} from collections import namedtuple

Создайте класс Person с полями name и age

Person = namedtuple(“Person”, [“name”, “age”])

Определите функцию, которая читает данные из файла

def read_data_from_file(filename): data = [] with open(filename, “r”) as file: for line in file: name, age = line.strip().split(”,”) person = Person(name, int(age)) data.append(person) return data

Вызовите функцию и передайте имя файла в качестве аргумента

filename = “data.csv” data = read_data_from_file(filename) for person in data: print(f”Name: {person.name}, Age: {person.age}”) {% endhighlight %}

В этом примере мы создали класс Person с полями name и age. Затем мы определили функцию read_data_from_file(), которая считывает данные из файла data.csv. Файл содержит строки с именем и возрастом, разделенными запятыми. Мы используем метод split(",") для разделения строк на имена и возраст. Затем мы создаем экземпляр класса Person для каждой строки и добавляем его в список данных. После этого мы выводим каждого человека в списке данных.

Выходные данные на экране будут такими:

Name: John, Age: 30
Name: Jane, Age: 25
Name: Mark, Age: 35

Использование named tuple по сравнению с другими структурами данных

Named tuple предоставляет удобные возможности для работы с данными, но иногда вам может потребоваться использовать другие структуры данных. Рассмотрим некоторые особенности использования named tuple по сравнению с другими структурами данных.

named tuple по сравнению с словарем

Named tuple предоставляет удобный и компактный способ хранения и доступа к данным, но его значения не могут быть изменены, так как named tuple является неизменяемой структурой данных. Если вам нужно изменить значения полей, вы должны создать новый экземпляр класса с новыми значениями. С другой стороны, словари позволяют динамически изменять значения ключей.

Named tuple преимущественно используется для хранения данных, которые не должны изменяться, например, координаты точек или результаты выполнения функции.

named tuple по сравнению с Data Class

Data Class - это класс, предоставляемый модулем dataclasses, который предоставляет удобные возможности для работы с данными. Data Class имеет сходную функциональность с named tuple, но Data Class более гибок и дает возможность определять различные атрибуты, методы и декораторы класса.

Если у вас есть сложные данные, которым требуется больше функциональности и поведения, то Data Class может быть лучшим вариантом. Однако, если у вас есть простые данные, которые нужно хранить и обрабатывать, named tuple может быть простым и эффективным решением.

named tuple по сравнению с typing.NamedTuple

Модуль typing предоставляет класс NamedTuple, который позволяет определять аннотированные типы для named tuple. По сравнению с обычными named tuple, класс NamedTuple предоставляет статическую типизацию и возможность определения типов для полей.

Если вам нужна статическая типизация или возможность определения типов для полей, класс NamedTuple может быть полезным. Однако, если вам нужно простое и легкое решение без статической типизации, обычный named tuple может быть предпочтительным вариантом.

Подклассирование классов named tuple

Помимо использования обычных named tuple, вы также можете подклассировать их для предоставления новых функций и возможностей. Подклассирование named tuple дает вам возможность настройки классов для конкретных случаев использования.

{% highlight python %} from collections import namedtuple

Создайте класс Point с полями x и y, подклассированный от named tuple

class Point(namedtuple(“Point”, [“x”, “y”])): def new(cls, x, y): # Добавьте пользовательскую логику при создании экземпляра класса # …

return super().__new__(cls, x, y)
def distance_to_origin(self):
# Добавьте пользовательскую логику для вычисления расстояния
# ...
return distance

Создайте экземпляр класса Point и вызовите пользовательский метод

point = Point(3, 4) distance = point.distance_to_origin() print(distance) {% endhighlight %}

В этом примере мы создали класс Point, который подклассирован от named tuple. Мы переопределили метод __new__() для добавления пользовательской логики при создании экземпляра класса. У нас есть также пользовательский метод distance_to_origin(), который выполняет свою логику.

Вы можете подклассировать named tuple и добавлять любую пользовательскую логику или методы, которые вам нужны для конкретного случая использования. Это дает максимальную гибкость при работе с данными.

Сравнение времени создания: tuple vs named tuple

Named tuple - это более гибкая и удобная альтернатива обычным кортежам, но создание named tuple может занять больше времени по сравнению с созданием обычного кортежа. Время создания named tuple зависит от сложности класса и числа полей.

Однако, разница во времени создания между обычными кортежами и named tuple обычно незначительная и не должна быть проблемой, если вы используете named tuple для хранения данных и доступа к ним.

Заключение

В этом руководстве вы узнали, как использовать named tuple для написания Python-кода с использованием именованных значений полей вместо неясных индексов. Вы также изучили некоторые полезные функции named tuple и способы использования named tuple для написания Pythonic-кода. Вы сравнили named tuple с другими структурами данных и узнали, как подклассифицировать named tuple для предоставления новых возможностей. Вы также рассмотрели вопрос времени создания для named tuple и обычных кортежей.

Надеемся, что эта статья поможет вам лучше понять и использовать named tuple в ваших проектах на Python.