@@ -3101,15 +3101,14 @@ import attrs
31013101
31023102@attrs.define
31033103class C:
3104- x = attrs.field()
3104+ x: int = attrs.field()
31053105
31063106[out]
31073107import attrs
31083108
31093109@attrs.define
31103110class C:
3111- x = ...
3112- def __init__(self, x) -> None: ...
3111+ x: int = attrs.field()
31133112
31143113[case testNamedTupleInClass]
31153114from collections import namedtuple
@@ -4050,8 +4049,9 @@ def i(x=..., y=..., z=...) -> None: ...
40504049[case testDataclass]
40514050import dataclasses
40524051import dataclasses as dcs
4053- from dataclasses import dataclass, InitVar, KW_ONLY
4052+ from dataclasses import dataclass, field, Field, InitVar, KW_ONLY
40544053from dataclasses import dataclass as dc
4054+ from datetime import datetime
40554055from typing import ClassVar
40564056
40574057@dataclasses.dataclass
@@ -4066,6 +4066,10 @@ class X:
40664066 h: int = 1
40674067 i: InitVar[str]
40684068 j: InitVar = 100
4069+ # Lambda not supported yet -> marked as Incomplete instead
4070+ k: str = Field(
4071+ default_factory=lambda: datetime.utcnow().isoformat(" ", timespec="seconds")
4072+ )
40694073 non_field = None
40704074
40714075@dcs.dataclass
@@ -4083,7 +4087,8 @@ class V: ...
40834087[out]
40844088import dataclasses
40854089import dataclasses as dcs
4086- from dataclasses import InitVar, KW_ONLY, dataclass, dataclass as dc
4090+ from _typeshed import Incomplete
4091+ from dataclasses import Field, InitVar, KW_ONLY, dataclass, dataclass as dc, field
40874092from typing import ClassVar
40884093
40894094@dataclasses.dataclass
@@ -4092,12 +4097,13 @@ class X:
40924097 b: str = ...
40934098 c: ClassVar
40944099 d: ClassVar = ...
4095- f: list[int] = ...
4096- g: int = ...
4100+ f: list[int] = field(init=False, default_factory=list)
4101+ g: int = field(default=2, kw_only=True)
40974102 _: KW_ONLY
40984103 h: int = ...
40994104 i: InitVar[str]
41004105 j: InitVar = ...
4106+ k: str = Field(default_factory=Incomplete)
41014107 non_field = ...
41024108
41034109@dcs.dataclass
@@ -4110,8 +4116,9 @@ class W: ...
41104116class V: ...
41114117
41124118[case testDataclass_semanal]
4113- from dataclasses import InitVar, dataclass, field
4119+ from dataclasses import Field, InitVar, dataclass, field
41144120from typing import ClassVar
4121+ from datetime import datetime
41154122
41164123@dataclass
41174124class X:
@@ -4125,13 +4132,18 @@ class X:
41254132 h: int = 1
41264133 i: InitVar = 100
41274134 j: list[int] = field(default_factory=list)
4135+ # Lambda not supported yet -> marked as Incomplete instead
4136+ k: str = Field(
4137+ default_factory=lambda: datetime.utcnow().isoformat(" ", timespec="seconds")
4138+ )
41284139 non_field = None
41294140
41304141@dataclass(init=False, repr=False, frozen=True)
41314142class Y: ...
41324143
41334144[out]
4134- from dataclasses import InitVar, dataclass
4145+ from _typeshed import Incomplete
4146+ from dataclasses import Field, InitVar, dataclass, field
41354147from typing import ClassVar
41364148
41374149@dataclass
@@ -4141,13 +4153,13 @@ class X:
41414153 c: str = ...
41424154 d: ClassVar
41434155 e: ClassVar = ...
4144- f: list[int] = ...
4145- g: int = ...
4156+ f: list[int] = field(init=False, default_factory=list)
4157+ g: int = field(default=2, kw_only=True)
41464158 h: int = ...
41474159 i: InitVar = ...
4148- j: list[int] = ...
4160+ j: list[int] = field(default_factory=list)
4161+ k: str = Field(default_factory=Incomplete)
41494162 non_field = ...
4150- def __init__(self, a, b, c=..., *, g=..., h=..., i=..., j=...) -> None: ...
41514163
41524164@dataclass(init=False, repr=False, frozen=True)
41534165class Y: ...
@@ -4175,7 +4187,7 @@ class X:
41754187class Y: ...
41764188
41774189[out]
4178- from dataclasses import InitVar, KW_ONLY, dataclass
4190+ from dataclasses import InitVar, KW_ONLY, dataclass, field
41794191from typing import ClassVar
41804192
41814193@dataclass
@@ -4184,14 +4196,13 @@ class X:
41844196 b: str = ...
41854197 c: ClassVar
41864198 d: ClassVar = ...
4187- f: list[int] = ...
4188- g: int = ...
4199+ f: list[int] = field(init=False, default_factory=list)
4200+ g: int = field(default=2, kw_only=True)
41894201 _: KW_ONLY
41904202 h: int = ...
41914203 i: InitVar[str]
41924204 j: InitVar = ...
41934205 non_field = ...
4194- def __init__(self, a, b=..., *, g=..., h=..., i, j=...) -> None: ...
41954206
41964207@dataclass(init=False, repr=False, frozen=True)
41974208class Y: ...
@@ -4236,15 +4247,13 @@ from dataclasses import dataclass
42364247@dataclass
42374248class X(missing.Base):
42384249 a: int
4239- def __init__(self, *generated_args, a, **generated_kwargs) -> None: ...
42404250
42414251@dataclass
42424252class Y(missing.Base):
42434253 generated_args: str
42444254 generated_args_: str
42454255 generated_kwargs: float
42464256 generated_kwargs_: float
4247- def __init__(self, *generated_args__, generated_args, generated_args_, generated_kwargs, generated_kwargs_, **generated_kwargs__) -> None: ...
42484257
42494258[case testDataclassTransform]
42504259# dataclass_transform detection only works with sementic analysis.
@@ -4298,6 +4307,7 @@ class Z(metaclass=DCMeta):
42984307
42994308[case testDataclassTransformDecorator_semanal]
43004309import typing_extensions
4310+ from dataclasses import field
43014311
43024312@typing_extensions.dataclass_transform(kw_only_default=True)
43034313def create_model(cls):
@@ -4307,9 +4317,11 @@ def create_model(cls):
43074317class X:
43084318 a: int
43094319 b: str = "hello"
4320+ c: bool = field(default=True)
43104321
43114322[out]
43124323import typing_extensions
4324+ from dataclasses import field
43134325
43144326@typing_extensions.dataclass_transform(kw_only_default=True)
43154327def create_model(cls): ...
@@ -4318,9 +4330,10 @@ def create_model(cls): ...
43184330class X:
43194331 a: int
43204332 b: str = ...
4321- def __init__(self, *, a, b=...) -> None: ...
4333+ c: bool = field(default=True)
43224334
43234335[case testDataclassTransformClass_semanal]
4336+ from dataclasses import field
43244337from typing_extensions import dataclass_transform
43254338
43264339@dataclass_transform(kw_only_default=True)
@@ -4329,8 +4342,10 @@ class ModelBase: ...
43294342class X(ModelBase):
43304343 a: int
43314344 b: str = "hello"
4345+ c: bool = field(default=True)
43324346
43334347[out]
4348+ from dataclasses import field
43344349from typing_extensions import dataclass_transform
43354350
43364351@dataclass_transform(kw_only_default=True)
@@ -4339,28 +4354,42 @@ class ModelBase: ...
43394354class X(ModelBase):
43404355 a: int
43414356 b: str = ...
4342- def __init__(self, *, a, b=...) -> None: ...
4357+ c: bool = field(default=True)
43434358
43444359[case testDataclassTransformMetaclass_semanal]
4360+ from dataclasses import field
4361+ from typing import Any
43454362from typing_extensions import dataclass_transform
43464363
4347- @dataclass_transform(kw_only_default=True)
4364+ def custom_field(*, default: bool, kw_only: bool) -> Any: ...
4365+
4366+ @dataclass_transform(kw_only_default=True, field_specifiers=(custom_field,))
43484367class DCMeta(type): ...
43494368
43504369class X(metaclass=DCMeta):
43514370 a: int
43524371 b: str = "hello"
4372+ c: bool = field(default=True) # should be ignored, not field_specifier here
4373+
4374+ class Y(X):
4375+ d: str = custom_field(default="Hello")
43534376
43544377[out]
4378+ from typing import Any
43554379from typing_extensions import dataclass_transform
43564380
4357- @dataclass_transform(kw_only_default=True)
4381+ def custom_field(*, default: bool, kw_only: bool) -> Any: ...
4382+
4383+ @dataclass_transform(kw_only_default=True, field_specifiers=(custom_field,))
43584384class DCMeta(type): ...
43594385
43604386class X(metaclass=DCMeta):
43614387 a: int
43624388 b: str = ...
4363- def __init__(self, *, a, b=...) -> None: ...
4389+ c: bool = ...
4390+
4391+ class Y(X):
4392+ d: str = custom_field(default='Hello')
43644393
43654394[case testAlwaysUsePEP604Union]
43664395import typing
@@ -4662,4 +4691,3 @@ class DCMeta(type): ...
46624691
46634692class DC(metaclass=DCMeta):
46644693 x: str
4665- def __init__(self, x) -> None: ...
0 commit comments