@@ -3101,15 +3101,14 @@ import attrs
3101
3101
3102
3102
@attrs.define
3103
3103
class C:
3104
- x = attrs.field()
3104
+ x: int = attrs.field()
3105
3105
3106
3106
[out]
3107
3107
import attrs
3108
3108
3109
3109
@attrs.define
3110
3110
class C:
3111
- x = ...
3112
- def __init__(self, x) -> None: ...
3111
+ x: int = attrs.field()
3113
3112
3114
3113
[case testNamedTupleInClass]
3115
3114
from collections import namedtuple
@@ -4050,8 +4049,9 @@ def i(x=..., y=..., z=...) -> None: ...
4050
4049
[case testDataclass]
4051
4050
import dataclasses
4052
4051
import dataclasses as dcs
4053
- from dataclasses import dataclass, InitVar, KW_ONLY
4052
+ from dataclasses import dataclass, field, Field, InitVar, KW_ONLY
4054
4053
from dataclasses import dataclass as dc
4054
+ from datetime import datetime
4055
4055
from typing import ClassVar
4056
4056
4057
4057
@dataclasses.dataclass
@@ -4066,6 +4066,10 @@ class X:
4066
4066
h: int = 1
4067
4067
i: InitVar[str]
4068
4068
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
+ )
4069
4073
non_field = None
4070
4074
4071
4075
@dcs.dataclass
@@ -4083,7 +4087,8 @@ class V: ...
4083
4087
[out]
4084
4088
import dataclasses
4085
4089
import 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
4087
4092
from typing import ClassVar
4088
4093
4089
4094
@dataclasses.dataclass
@@ -4092,12 +4097,13 @@ class X:
4092
4097
b: str = ...
4093
4098
c: ClassVar
4094
4099
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)
4097
4102
_: KW_ONLY
4098
4103
h: int = ...
4099
4104
i: InitVar[str]
4100
4105
j: InitVar = ...
4106
+ k: str = Field(default_factory=Incomplete)
4101
4107
non_field = ...
4102
4108
4103
4109
@dcs.dataclass
@@ -4110,8 +4116,9 @@ class W: ...
4110
4116
class V: ...
4111
4117
4112
4118
[case testDataclass_semanal]
4113
- from dataclasses import InitVar, dataclass, field
4119
+ from dataclasses import Field, InitVar, dataclass, field
4114
4120
from typing import ClassVar
4121
+ from datetime import datetime
4115
4122
4116
4123
@dataclass
4117
4124
class X:
@@ -4125,13 +4132,18 @@ class X:
4125
4132
h: int = 1
4126
4133
i: InitVar = 100
4127
4134
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
+ )
4128
4139
non_field = None
4129
4140
4130
4141
@dataclass(init=False, repr=False, frozen=True)
4131
4142
class Y: ...
4132
4143
4133
4144
[out]
4134
- from dataclasses import InitVar, dataclass
4145
+ from _typeshed import Incomplete
4146
+ from dataclasses import Field, InitVar, dataclass, field
4135
4147
from typing import ClassVar
4136
4148
4137
4149
@dataclass
@@ -4141,13 +4153,13 @@ class X:
4141
4153
c: str = ...
4142
4154
d: ClassVar
4143
4155
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)
4146
4158
h: int = ...
4147
4159
i: InitVar = ...
4148
- j: list[int] = ...
4160
+ j: list[int] = field(default_factory=list)
4161
+ k: str = Field(default_factory=Incomplete)
4149
4162
non_field = ...
4150
- def __init__(self, a, b, c=..., *, g=..., h=..., i=..., j=...) -> None: ...
4151
4163
4152
4164
@dataclass(init=False, repr=False, frozen=True)
4153
4165
class Y: ...
@@ -4175,7 +4187,7 @@ class X:
4175
4187
class Y: ...
4176
4188
4177
4189
[out]
4178
- from dataclasses import InitVar, KW_ONLY, dataclass
4190
+ from dataclasses import InitVar, KW_ONLY, dataclass, field
4179
4191
from typing import ClassVar
4180
4192
4181
4193
@dataclass
@@ -4184,14 +4196,13 @@ class X:
4184
4196
b: str = ...
4185
4197
c: ClassVar
4186
4198
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)
4189
4201
_: KW_ONLY
4190
4202
h: int = ...
4191
4203
i: InitVar[str]
4192
4204
j: InitVar = ...
4193
4205
non_field = ...
4194
- def __init__(self, a, b=..., *, g=..., h=..., i, j=...) -> None: ...
4195
4206
4196
4207
@dataclass(init=False, repr=False, frozen=True)
4197
4208
class Y: ...
@@ -4236,15 +4247,13 @@ from dataclasses import dataclass
4236
4247
@dataclass
4237
4248
class X(missing.Base):
4238
4249
a: int
4239
- def __init__(self, *generated_args, a, **generated_kwargs) -> None: ...
4240
4250
4241
4251
@dataclass
4242
4252
class Y(missing.Base):
4243
4253
generated_args: str
4244
4254
generated_args_: str
4245
4255
generated_kwargs: float
4246
4256
generated_kwargs_: float
4247
- def __init__(self, *generated_args__, generated_args, generated_args_, generated_kwargs, generated_kwargs_, **generated_kwargs__) -> None: ...
4248
4257
4249
4258
[case testDataclassTransform]
4250
4259
# dataclass_transform detection only works with sementic analysis.
@@ -4298,6 +4307,7 @@ class Z(metaclass=DCMeta):
4298
4307
4299
4308
[case testDataclassTransformDecorator_semanal]
4300
4309
import typing_extensions
4310
+ from dataclasses import field
4301
4311
4302
4312
@typing_extensions.dataclass_transform(kw_only_default=True)
4303
4313
def create_model(cls):
@@ -4307,9 +4317,11 @@ def create_model(cls):
4307
4317
class X:
4308
4318
a: int
4309
4319
b: str = "hello"
4320
+ c: bool = field(default=True)
4310
4321
4311
4322
[out]
4312
4323
import typing_extensions
4324
+ from dataclasses import field
4313
4325
4314
4326
@typing_extensions.dataclass_transform(kw_only_default=True)
4315
4327
def create_model(cls): ...
@@ -4318,9 +4330,10 @@ def create_model(cls): ...
4318
4330
class X:
4319
4331
a: int
4320
4332
b: str = ...
4321
- def __init__(self, *, a, b=...) -> None: ...
4333
+ c: bool = field(default=True)
4322
4334
4323
4335
[case testDataclassTransformClass_semanal]
4336
+ from dataclasses import field
4324
4337
from typing_extensions import dataclass_transform
4325
4338
4326
4339
@dataclass_transform(kw_only_default=True)
@@ -4329,8 +4342,10 @@ class ModelBase: ...
4329
4342
class X(ModelBase):
4330
4343
a: int
4331
4344
b: str = "hello"
4345
+ c: bool = field(default=True)
4332
4346
4333
4347
[out]
4348
+ from dataclasses import field
4334
4349
from typing_extensions import dataclass_transform
4335
4350
4336
4351
@dataclass_transform(kw_only_default=True)
@@ -4339,28 +4354,42 @@ class ModelBase: ...
4339
4354
class X(ModelBase):
4340
4355
a: int
4341
4356
b: str = ...
4342
- def __init__(self, *, a, b=...) -> None: ...
4357
+ c: bool = field(default=True)
4343
4358
4344
4359
[case testDataclassTransformMetaclass_semanal]
4360
+ from dataclasses import field
4361
+ from typing import Any
4345
4362
from typing_extensions import dataclass_transform
4346
4363
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,))
4348
4367
class DCMeta(type): ...
4349
4368
4350
4369
class X(metaclass=DCMeta):
4351
4370
a: int
4352
4371
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")
4353
4376
4354
4377
[out]
4378
+ from typing import Any
4355
4379
from typing_extensions import dataclass_transform
4356
4380
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,))
4358
4384
class DCMeta(type): ...
4359
4385
4360
4386
class X(metaclass=DCMeta):
4361
4387
a: int
4362
4388
b: str = ...
4363
- def __init__(self, *, a, b=...) -> None: ...
4389
+ c: bool = ...
4390
+
4391
+ class Y(X):
4392
+ d: str = custom_field(default='Hello')
4364
4393
4365
4394
[case testAlwaysUsePEP604Union]
4366
4395
import typing
@@ -4662,4 +4691,3 @@ class DCMeta(type): ...
4662
4691
4663
4692
class DC(metaclass=DCMeta):
4664
4693
x: str
4665
- def __init__(self, x) -> None: ...
0 commit comments