Передача аргумента списка по умолчанию в класс данных - PullRequest
0 голосов
/ 28 августа 2018

Я хотел бы передать аргумент по умолчанию в моем классе, но почему-то у меня проблема:

from dataclasses import dataclass, field
from typing import List

@dataclass
class Pizza():
    ingredients: List = field(default_factory=['dow', 'tomatoes'])
    meat: str = field(default='chicken')

    def __repr__(self):
        return 'preparing_following_pizza {} {}'.format(self.ingredients, self.meat)

Если я сейчас попытаюсь создать экземпляр Pizza, я получу следующую ошибку:

>>> my_order = Pizza()
Traceback (most recent call last):
  File "pizza.py", line 13, in <module>
    Pizza()
  File "<string>", line 2, in __init__
TypeError: 'list' object is not callable

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Для сложных типов данных, я склонен сокращаться так:

from dataclasses import dataclass, field
from typing import Dict, Tuple

def default_field(obj):
    return field(default_factory=lambda: obj)

@dataclass
class C:
    complex_attribute: Dict[str, Tuple[int, str]] = default_field({"a": (1, "x"), "b": (1, "y")})
0 голосов
/ 28 августа 2018

Из dataclasses.field документов :

Параметры для field():

  • default_factory: Если указано, это должен быть вызываемый нулевой аргумент , который будет вызываться, когда для этого поля требуется значение по умолчанию. среди другие цели, это может быть использовано для указания полей с изменяемым значения по умолчанию, как описано ниже. Ошибочно указывать оба default и default_factory.

Ваш default_factory является не вызываемым по 0 аргументом, а списком, который является причиной ошибки:

@dataclass
class Pizza():
    ingredients: List = field(default_factory=['dow', 'tomatoes'])  # <- wrong!

Вместо этого используйте лямбда-функцию:

@dataclass
class Pizza():
    ingredients: List = field(default_factory=lambda: ['dow', 'tomatoes'])
...