Python - как повторно использовать класс данных с ограниченным количеством полей? - PullRequest
1 голос
/ 06 августа 2020

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

self.metrics_provider = TestMetricsProvider(data)
E       TypeError: __init__() missing 3 required positional arguments: 'class_name', 'type', and 'score'

Базовый класс данных:

@dataclass
class MetricsProvider:
    name: str
    class_name: str
    type: str
    score: str
    source: str
    location: str = DEFAULT_LOCATION
    algorithm: Optional[str] = None

Dataclass в тесте:

@dataclass
class TestMetricsProvider(MetricsProvider):
    pass

data = dict(
    name="test",
    class_name="test_class",
    type="test_type"
    score="test_score",
    source="test_source")

class TestMetrics(unittest.TestCase):
    def setUp(self) -> None:
        self.metrics_provider = TestMetricsProvider(data)

Определение тестового класса данных, как показано ниже, привело к ошибке: E TypeError: __init__() takes 1 positional argument but 2 were given

@dataclass
class TestMetricsProvider(MetricsProvider):
    def __init__(self):
        super().__init__()

Как мне правильно создать его в этом случае? А может, надо как-то поиздеваться?

1 Ответ

2 голосов
/ 06 августа 2020

Передайте ваш словарь значений как аргументы ключевого слова (также известный как **kwargs):

class TestMetrics(unittest.TestCase):
    def setUp(self) -> None:
        self.metrics_provider = TestMetricsProvider(**data)

Конструктор класса данных ожидает фактические значения полей как аргументы ключевого слова. Когда вы используете TestMetricsProvider(data), вы передаете data словарь в качестве значения для первого поля name, делая его похожим на TestMetricsProvider(name=data).

...