класс данных, содержащий инициализированный набор? - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь использовать класс данных для чего-то, и в нем мне нужно инициализировать пустой набор, но я не могу понять, как это сделать. До использования класса данных (просто обычный класс) рабочий эквивалент, который у меня был, был self.children = set(), и это было хорошо для моих целей. Как я могу получить этот эквивалент в классе данных?

Мне нужно, чтобы он был инициализирован по умолчанию, не нужно каждый раз передавать его в качестве параметра.

from dataclasses import dataclass, field


@dataclass(unsafe_hash=True)
class Node:
    index: int
    name: str
    children: set = field(default_factory=set, hash=True)

Ошибка, которую я получаю при попытке добавить элемент в набор. Добавляемый элемент имеет тип Node (класс выше).

    root.children.add(child)
  File "<string>", line 2, in __hash__
TypeError: unhashable type: 'set'

1 Ответ

2 голосов
/ 03 февраля 2020

Это:

children: set = field(default_factory=set)

Значение по умолчанию factory - это функция , которая будет вызываться при инициализации поля, которое возвращает начальное значение. Следовательно, передайте его set без вызова , что является функцией, которая при вызове возвращает новый набор. Вы также должны добавить аннотацию типа : set для класса данных, чтобы выбрать его в качестве поля.

...