import dataclasses dataclasses.field(*, default=MISSING, default_factory=MISSING, repr=True, hash=None, init=True, compare=True, metadata=None)
default=MISSING
- значение по умолчанию,default_factory=MISSING
- фабричная функция,repr=True
- флаг для создания метода __repr__()
,hash=None
- флаг для создания метода __hash__()
,init=True
- флаг для создания метода __init__()
,compare=True
- будет ли участвовать поле в сравнении,metadata=None
- словарь пространства имен в метаданных.Функция field()
модуля dataclasses
вызывается для некоторой дополнительной информации конкретного поля класса данных. Чтобы удовлетворить эту потребность, можно заменить значение поля по умолчанию, вызовом функции dataclasses.field()
.
Например:
@dataclass class C: mylist: list[int] = field(default_factory=list) c = C() c.mylist += [1, 2, 3]
В приведенном выше синтаксисе можно заметить, что default
и default_factory
равны значению MISSING
- это контрольный объект, используемый для определения того, предоставлены ли параметры default
и default_factory
. Так как None
является допустимым по умолчанию значением для полей, то используется этот контрольный объект. Никакой код не должен напрямую использовать значение MISSING
.
Поведение функции dataclasses.field()
в зависимости от значений аргументов:
default
: если указано, то это будет значение по умолчанию для вызываемого поля. Такое поведение необходимо, так как сам вызов dataclasses.field()
заменяет нормальную позицию значения по умолчанию.
default_factory
: если предоставлено, то это должен быть вызываемый объект с без аргументов, который будет вызываться, когда для этого поля потребуется значение по умолчанию. Такое поведение можно использовать для указания полей с изменяемыми значениями по умолчанию, как описано ниже. Ошибочно указывать и default
и default_factory
одновременно.
init
: если True
(по умолчанию), то это поле включается как параметр в сгенерированный метод __init__()
.
repr
: если True
(по умолчанию), то это поле включается в строку, возвращаемую методом __repr__()
.
compare: если true (по умолчанию), это поле включается в сгенерированные методы сравнения и сравнения (__eq __ (), __gt __ () и др.).
hash
: значение может быть bool
или None
. Если True
, то это поле включается в сгенерированный метод __hash__()
. Если None
(по умолчанию), то используйте значение аргумента compare
: обычно это ожидаемое поведение. Поле следует учитывать в хэше, если оно используется для сравнения. Не рекомендуется устанавливать для этого значения какое то другое, кроме None
.
Одна из возможных причин для установки hash=False
и compare=True
может заключаться в том, что для поля сложно вычислять хеш-значение, это поле необходимо для проверки равенства, и есть другие поля, которые влияют на хеш-значение типа. Даже если поле исключено из хэша, оно все равно будет использоваться для сравнения.
metadata
: значение может быть словарем или None
. Пустой словарь недействителен. Это значение доступно только для чтения, и отображается в объекте Field
. Оно вообще не используется классами данных и предоставляется как сторонний механизм расширения. Некоторые разработчики используют его в качестве пространства имен в метаданных.
Если значение поля по умолчанию задается вызовом dataclasses.field()
, то тогда атрибут класса для этого поля будет заменен указанным значением по умолчанию. Если значение по умолчанию не указано, то атрибут класса будет удален. Цель состоит в том, что после запуска декоратора @dataclass()
все атрибуты класса будут содержать значения по умолчанию для полей, как если бы само значение по умолчанию было указано. Например, после:
@dataclass class C: x: int y: int = field(repr=False) z: int = field(repr=False, default=10) t: int = 20
Атрибут класса C.z
будет равен 10, атрибут класса C.t
будет равен 20, а атрибуты класса C.x
и C.y
не будут установлены.
field()
для полей класса данных.default
.Этот параметр задает значение по умолчанию для атрибута, если при создании объекта значение не задано. Подобно параметрам в функции, поля со значением по умолчанию должны следовать за любыми полями без значения по умолчанию.
from dataclasses import dataclass, field @dataclass class Article: title: str language: str = field(default ='Python3') >>> article = Article("User Types") >>> article # Article(title='User Types', language='Python3')
default_factory
.Аргумент default_factory
должен быть вызываемый объект без аргументов и будет вызываться, когда для этого поля потребуется значение по умолчанию.
Возвращаемое значение будет установлено как значение по умолчанию для атрибута при создании объекта. Ошибочно указывать и default
и default_factory
одновременно. Необходимо предоставить либо вызываемый объект фабричной функции default_factory
, либо предоставить значение default
для атрибута.
from dataclasses import dataclass, field from random import choice def get_language(): languages = ['Python3', 'Java', "C"] return choice(languages) @dataclass class Article: title: str language: str = field(default_factory=get_language) >>> article = Article("User Types") >>> article # Article(title='User Types', language='Java')
compare
, repr
и init
.Аргументы init
, repr
и hash
аналогичны аргументам декоратора @dataclass
. Параметр compare
может быть связан с порядком, как и в @dataclass
. Разница заключается в их способности быть применимыми только к определенному атрибуту, а не ко всем атрибутам в классе данных под декоратором.
Если аргумент compare=True
(по умолчанию), то это поле включается в сгенерированные методы сравнения и сравнения.
from dataclasses import dataclass, field @dataclass class Article: title: str = field(compare=False) site: str = field(repr=False) language: str = field(default='Python3') likes: int = field(init=False, default=0) # Обратите внимание на разные `title` >>> article1 = Article('User Types', 'docs-python.ru') >>> article2 = Article('Python import', 'docs-python.ru') >>> article1 # Article(title='User Types', language='Python3', likes=0) >>> article1.site # 'docs-python.ru' >>> article1 == article2 # True