← Back to index

dataclasses_transform_field.py

True Positive
False Positive
False Negative
Optional (detected)
Warning or Info
TP: 2
FP: 0
FN: 0
Optional: 0 / 0
1"""
2Tests the dataclass_transform mechanism honors implicit default values
3in field parameters.
4"""
5
6# Specification: https://typing.readthedocs.io/en/latest/spec/dataclasses.html#field-specifier-parameters
7
8from typing import Any, Callable, Literal, TypeVar, dataclass_transform, overload
9
10T = TypeVar("T")
12# > Field specifier functions can use overloads that implicitly specify the
13# > value of init using a literal bool value type (Literal[False] or Literal[True]).
15@overload
16def field1(
17 *,
18 default: str | None = None,
19 resolver: Callable[[], Any],
20 init: Literal[False] = False,
21) -> Any:
22 ...
25@overload
26def field1(
27 *,
28 default: str | None = None,
29 resolver: None = None,
30 init: Literal[True] = True,
31) -> Any:
32 ...
35def field1(
36 *,
37 default: str | None = None,
38 resolver: Callable[[], Any] | None = None,
39 init: bool = True,
40) -> Any:
41 ...
44def field2(*, init: bool = False, kw_only: bool = True) -> Any:
45 ...
48@dataclass_transform(kw_only_default=True, field_specifiers=(field1, field2))
49def create_model(*, init: bool = True) -> Callable[[type[T]], type[T]]:
50 raise NotImplementedError
53@create_model()
54class CustomerModel1:
55 id: int = field1(resolver=lambda: 0)
56 name: str = field1(default="Voldemort")
59CustomerModel1()
60CustomerModel1(name="hi")
62# This should generate an error because "id" is not
63# supposed to be part of the init function.
64CustomerModel1(id=1, name="hi") # E
[unknown-argument] Argument `id` does not match any known parameter
67@create_model()
68class CustomerModel2:
69 id: int = field2()
70 name: str = field2(init=True)
73# This should generate an error because kw_only is True
74# by default for field2.
75CustomerModel2(1) # E
[missing-argument] No argument provided for required parameter `name` [too-many-positional-arguments] Too many positional arguments: expected 0, got 1
77CustomerModel2(name="Fred")