You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Support if statements in dataclass and dataclass_transform plugin (#14854)
Fixes: #14853
Adding support for `if` statements in the `dataclass` and `dataclass_transform` decorators, so
the attributes defined conditionally are treated as those that are
directly in class body.
from typing import dataclass_transform, Type, TYPE_CHECKING
458
+
459
+
@dataclass_transform()
460
+
def model(cls: Type) -> Type:
461
+
return cls
462
+
463
+
@model
464
+
class FunctionModel:
465
+
if TYPE_CHECKING:
466
+
string_: str
467
+
integer_: int
468
+
else:
469
+
string_: tuple
470
+
integer_: tuple
471
+
472
+
FunctionModel(string_="abc", integer_=1)
473
+
FunctionModel(string_="abc", integer_=tuple()) # E: Argument "integer_" to "FunctionModel" has incompatible type "Tuple[<nothing>, ...]"; expected "int"
from typing import dataclass_transform, Type, TYPE_CHECKING
481
+
482
+
@dataclass_transform()
483
+
def model(cls: Type) -> Type:
484
+
return cls
485
+
486
+
@model
487
+
class FunctionModel:
488
+
if not TYPE_CHECKING:
489
+
string_: tuple
490
+
integer_: tuple
491
+
else:
492
+
string_: str
493
+
integer_: int
494
+
495
+
FunctionModel(string_="abc", integer_=1)
496
+
FunctionModel(string_="abc", integer_=tuple()) # E: Argument "integer_" to "FunctionModel" has incompatible type "Tuple[<nothing>, ...]"; expected "int"
from typing import dataclass_transform, TYPE_CHECKING
505
+
506
+
@dataclass_transform()
507
+
class ModelBase:
508
+
...
509
+
510
+
class BaseClassModel(ModelBase):
511
+
if TYPE_CHECKING:
512
+
string_: str
513
+
integer_: int
514
+
else:
515
+
string_: tuple
516
+
integer_: tuple
517
+
518
+
BaseClassModel(string_="abc", integer_=1)
519
+
BaseClassModel(string_="abc", integer_=tuple()) # E: Argument "integer_" to "BaseClassModel" has incompatible type "Tuple[<nothing>, ...]"; expected "int"
from typing import dataclass_transform, TYPE_CHECKING
527
+
528
+
@dataclass_transform()
529
+
class ModelBase:
530
+
...
531
+
532
+
class BaseClassModel(ModelBase):
533
+
if not TYPE_CHECKING:
534
+
string_: tuple
535
+
integer_: tuple
536
+
else:
537
+
string_: str
538
+
integer_: int
539
+
540
+
BaseClassModel(string_="abc", integer_=1)
541
+
BaseClassModel(string_="abc", integer_=tuple()) # E: Argument "integer_" to "BaseClassModel" has incompatible type "Tuple[<nothing>, ...]"; expected "int"
from typing import dataclass_transform, Type, TYPE_CHECKING
549
+
550
+
@dataclass_transform()
551
+
class ModelMeta(type):
552
+
...
553
+
554
+
class ModelBaseWithMeta(metaclass=ModelMeta):
555
+
...
556
+
557
+
class MetaClassModel(ModelBaseWithMeta):
558
+
if TYPE_CHECKING:
559
+
string_: str
560
+
integer_: int
561
+
else:
562
+
string_: tuple
563
+
integer_: tuple
564
+
565
+
MetaClassModel(string_="abc", integer_=1)
566
+
MetaClassModel(string_="abc", integer_=tuple()) # E: Argument "integer_" to "MetaClassModel" has incompatible type "Tuple[<nothing>, ...]"; expected "int"
from typing import dataclass_transform, Type, TYPE_CHECKING
574
+
575
+
@dataclass_transform()
576
+
class ModelMeta(type):
577
+
...
578
+
579
+
class ModelBaseWithMeta(metaclass=ModelMeta):
580
+
...
581
+
582
+
class MetaClassModel(ModelBaseWithMeta):
583
+
if not TYPE_CHECKING:
584
+
string_: tuple
585
+
integer_: tuple
586
+
else:
587
+
string_: str
588
+
integer_: int
589
+
590
+
MetaClassModel(string_="abc", integer_=1)
591
+
MetaClassModel(string_="abc", integer_=tuple()) # E: Argument "integer_" to "MetaClassModel" has incompatible type "Tuple[<nothing>, ...]"; expected "int"
0 commit comments