Рубрики
Без рубрики

Узнайте, как работают обработки данных в Python

Нам обычно работают с простыми структурами данных, такими как кортеж (кортеж) или словарь … Tagged с помощью Python, программирования, WebDev, Tuperial.

Нам обычно работают с простыми структурами данных, такими как кортеж ( tuple ) или словарь ( dict ) в Python. Мы используем их почти везде и каждый день в нашей жизни программистов для хранения данных.

Например, мы можем представлять автомобильный объект с примером кода ниже

# Using Dictionary
car = {"name": "Model X", "brand": "Tesla", "price": 120_000}

# OR using Tuple
car = ("Model X", "Tesla", 120_000)

Тем не менее, эти основные структуры данных становятся менее идеальными, когда нам приходится иметь дело с более сложными данными. Здесь мы должны помнить, что автомобиль представляет собой автомобильный словарь или кортеж в нашем приложении, а не какую -то строку или целое число.

Использование Tuple для представления нашего автомобильного объекта в приведенном выше примере работает просто хорошо, если у нас есть только три поля ( name , brand и price ). Поскольку мы добавляем больше полей в наш автомобильный объект, такие как производитель , условие и т. д., нам нужно вспомнить порядок наших атрибутов.

Для случая использования словаря мы не смогли бы использовать точечная нотация (т.е. car.name ) для доступа к нашим атрибутам. Кроме того, глубоко заложенный словарь имеет тенденцию быть очень грязным для работы.

Здесь мы поговорим о лучших альтернативах нашему обычному словарю или кортеже.

Темы охватывали

  • Названный Тупел
  • Классы данных, лучшая альтернатива названным корпусам
  • Настройка классов данных
  • Когда использовать классы данных

Давайте начнем!

Назван Tuple на помощь

Более распространенным подходом является использование с именем Tuple ( по имени ) из встроенного Python Коллекции библиотека.

Использование нашего примера автомобиля выше здесь – это то, как будет выглядеть название Tuple:

from collections import namedtuple

Car = namedtuple('Car', ['name', 'brand', 'price'])
car = Car('Model X', 'Tesla', 120_000)

Намного лучше. Итак, почему бы просто не использовать с именем Tuple все время?

Ну, названный Tuple поставляется со своими собственными наборами ограничений. Помимо неспособности присвоить значение по умолчанию нашим свойствам автомобиля, названный Tuple неизменен по своей природе.

Вот объяснение от PEP О том, почему мы не должны просто использовать с именем Tuple Анкет

Более того, использование словаря, корпуса или даже названного корпуса не позволяет нам иметь пользовательские методы класса, что задает вопрос: почему бы просто не использовать обычные Python Class

Python Class

В Python все является объектом, и большинство объектов имеют атрибуты и методы. Как правило, мы бы использовали класс в Python, чтобы создать наши собственные объекты со своими собственными свойствами и методами. Используя наш предыдущий пример для создания простого автомобильного объекта:

class Car:
    def __init__(self, name: str, brand: str, price: int) -> None:
        self.name = name
        self.brand = brand
        self.price = price


car1 = Car('Model X', 'Tesla', 120_000)
car2 = Car('Model X', 'Tesla', 120_000)

car1 == car2 # False. We need to write our own __eq__ method to handle this.

Каждый раз, когда в наш автомобильный объект добавляется новое свойство, нам нужно было бы передать их в __init__ метод Что если нам нужно было добавить более описательное представление нашего автомобильного объекта в нашем __repr__ метод? Что если нам нужно сравнить два экземпляра автомобиля с одним и тем же автомобильным объектом?

Честно говоря, все не так уж и плохо, когда мы имеем дело только с одним автомобильным объектом. Но Что если мы должны добавить больше классов, таких как Производитель , Cardealer , так далее.?

Как вы уже можете сказать, признаки дублирования кода повсюду, и оно пахнет! Правда, которую нужно сказать, если нам действительно не нужны пользовательские методы, нам может быть лучше, используя названный Tuple.

Как носитель плохих новостей, это часто не так в реальной жизни.

Введите классы данных

Представлено в Python 3.7, Классы данных ( DataClasses ) поставьте нас простым способом сделать наши объекты класса менее многословными. Чтобы упростить, классы данных – это только обычные классы, которые помогают нам абстрагировать тонну кодов шаблонов.

Чтобы переписать наш предыдущий пример с классом данных, мы просто должны украсить наш основной класс с помощью @dataclass :

from dataclasses import dataclass

@dataclass
class Car:
    name: str # Supports typing out of the box!
    brand: str
    price: int

car1 = Car('Model X', 'Tesla', 120_000)
car2 = Car('Model X', 'Tesla', 120_000)

car1 == car2 # True. __eq__ is generated automatically.

car2.name # Supports dot annotation!

Лучшая часть класса данных заключается в том, что он автоматически генерирует общий Дандер методы в классе, таким как __repr__ и __eq__ , устраняя весь дублированный код.

Настройка класса данных

  1. В некоторых случаях нам может потребоваться настроить наши поля класса данных:

  2. Чтобы переопределить, что происходит после __init__ В нашем недавно созданном классе данных мы можем объявить __post_init__ метод Например, мы можем легко переопределить цену автомобиля на основе его инициализированного условия:

  3. Чтобы сделать наш класс данных неизменным, мы просто должны добавить @dataclass (замороженное = true) как наш декоратор.

  4. Еще один хороший пример использования класса данных – это когда нам нужно иметь дело с вложенным словарем. Вот простой пример того, что может сделать класс данных:

  5. Наконец, в случае, если это не было очевидно, класс данных также поддерживает наследство, поскольку они действительно ведут себя так же, как и наш старый добрый обычный класс.

Итак, когда использовать класс данных?

против названного Тупеля

Использование класса данных чаще всего сравнивается с использованием названного корпуса. По большей части класс данных предлагает такое же преимущество, если не больше, чем называется Tuple.

В случае, где вам нужно распаковать Ваши переменные, вы можете вместо этого рассмотреть вопрос о использовании именованного корпуса.

против словаря

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

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

Наконец, класс данных также сохраняет информацию типа для каждого свойства, что является огромным дополнительным преимуществом!

Заключительные мысли

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

Подводя итог, что мы прошли, класс данных великолепен, потому что это:

  • Экономит время и уменьшает дублирование кода
  • Предлагает большую гибкость, это может быть изменчивым или неизменным
  • Поддерживает наследство
  • Позволяет настраивать и значения по умолчанию

Не поймите меня неправильно. Не каждый класс в Python должен быть классом данных. Класс данных – это не серебряная пуля.

По большей части мы всегда должны помнить, что мы не должны усложнять вещи, если нам не нужно. Пока мы не имеем дело с чем -то чрезмерно сложным, старый добрый словарь может просто сделать работу.

Спасибо за чтение!

Оригинал: “https://dev.to/jerrynsh/learn-how-dataclasses-work-in-python-37a2”