0Pricing
Python Academy · Урок

Значения по умолчанию и field()

Задавайте значения по умолчанию и используйте параметры field()

«Значения по умолчанию и field()» — бесплатный урок Python Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Значения полей по умолчанию

Как и параметры функций, поля датакласса могут иметь значения по умолчанию. Поле со значением по умолчанию можно не указывать при создании экземпляра.

from dataclasses import dataclass

@dataclass
class Server:
    host: str
    port: int = 8080

print(Server('localhost'))
print(Server('example.com', 443))

Порядок имеет значение

Поля со значениями по умолчанию должны идти после полей без значений по умолчанию, точно как аргументы функций. В противном случае Python выдаст TypeError при определении класса.

from dataclasses import dataclass

@dataclass
class User:
    name: str       # required
    active: bool = True   # optional

print(User('Alice'))

Проблема изменяемого значения по умолчанию

Нельзя использовать изменяемый объект, например список или словарь, непосредственно в качестве значения по умолчанию. Все экземпляры будут совместно использовать один и тот же объект. Python обнаруживает это и выдаёт ValueError, защищая Вас от ошибки.

from dataclasses import dataclass
from typing import List

# This raises ValueError at class definition time:
try:
    @dataclass
    class Bad:
        items: List[int] = []
except ValueError as e:
    print('Error:', e)

field(default_factory=...)

Чтобы задать изменяемое значение по умолчанию, используйте field(default_factory=...). Фабрика вызывается для каждого нового экземпляра, поэтому каждый экземпляр получает собственный новый объект.

from dataclasses import dataclass, field
from typing import List

@dataclass
class Cart:
    items: List[str] = field(default_factory=list)

a = Cart()
a.items.append('apple')
b = Cart()
print(a.items, b.items)

default и default_factory

Используйте field(default=...) для неизменяемых значений, если Вам также нужны другие параметры field(). Для изменяемых объектов используйте default_factory. Нельзя передавать оба параметра одновременно.

from dataclasses import dataclass, field

@dataclass
class Config:
    retries: int = field(default=3)
    tags: list = field(default_factory=list)

print(Config())

Исключение поля из представления

Параметр repr=False скрывает поле в автоматически созданном __repr__. Это полезно для секретов или больших внутренних буферов.

from dataclasses import dataclass, field

@dataclass
class Account:
    user: str
    token: str = field(repr=False, default='secret')

print(Account('alice'))

Исключение поля из сравнения

При использовании compare=False поле игнорируется автоматически созданным __eq__ (а также при упорядочивании). Два экземпляра могут быть равны, даже если значения этого поля различаются.

from dataclasses import dataclass, field

@dataclass
class Event:
    name: str
    timestamp: float = field(compare=False, default=0.0)

print(Event('login', 1.0) == Event('login', 99.0))

Поля без параметра __init__

Установка init=False исключает поле из __init__. Обычно это сочетают со значением по умолчанию или задают поле в __post_init__.

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

c = Circle(2.0)
print(c)

__post_init__ для производных значений

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

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

    def __post_init__(self):
        self.area = 3.14159 * self.radius ** 2

print(Circle(2.0))

Хранение метаданных

Аргумент metadata прикрепляет к полю произвольное отображение. Python его игнорирует, но инструменты и Ваш собственный код могут читать его для документации или подсказок по проверке.

from dataclasses import dataclass, field, fields

@dataclass
class Product:
    price: float = field(metadata={'unit': 'USD'})

for f in fields(Product):
    print(f.name, f.metadata)

Комбинирование параметров field()

Параметры можно комбинировать. Одно поле может одновременно скрываться из repr, не участвовать в сравнении и иметь значение по умолчанию.

from dataclasses import dataclass, field

@dataclass
class Session:
    user: str
    token: str = field(default='x', repr=False, compare=False)

print(Session('alice'))
print(Session('alice') == Session('alice', token='different'))

Быстрая проверка

Как задать полю датакласса пустой список в качестве значения по умолчанию?

Повторение

Вы научились задавать значения по умолчанию и использовать параметры field().

  • Поля со значениями по умолчанию идут после обязательных полей.
  • Используйте default_factory для изменяемых значений по умолчанию.
  • Параметры repr, compare, init и metadata настраивают каждое поле.
  • __post_init__ вычисляет производные значения.

Часто задаваемые вопросы

Урок «Значения по умолчанию и field()» бесплатный?

Да — полный текст урока «Значения по умолчанию и field()» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Значения по умолчанию и field()»?

Задавайте значения по умолчанию и используйте параметры field() Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Значения по умолчанию и field()»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Определение датакласса
  2. Значения по умолчанию и field()
  3. Параметры неизменяемости и сравнения
  4. Библиотека attrs
← Назад к Python Academy