parent
a06264a8a4
commit
e21593e86e
2 changed files with 0 additions and 75 deletions
@ -1,43 +0,0 @@ |
||||
# import attr |
||||
from enum import Enum |
||||
from typing import get_origin, get_args, get_type_hints |
||||
from dataclasses import dataclass, field, is_dataclass |
||||
|
||||
auto_obj = object() |
||||
|
||||
|
||||
def auto_field(): |
||||
return auto_obj |
||||
|
||||
|
||||
def apply_auto_fields(cls): |
||||
cls_annotations = cls.__dict__.get('__annotations__', {}) |
||||
for name, typ in cls_annotations.items(): |
||||
current_value = getattr(cls, name, None) |
||||
if current_value is auto_obj: |
||||
origin_typ = get_origin(typ) or typ |
||||
if isinstance(origin_typ, str): |
||||
raise TypeError(f"Forward references are not supported for auto_field: '{origin_typ}'. Use a default_factory with lambda instead.") |
||||
elif origin_typ in (int, float, str, bytes, list, tuple, set, dict, bool) or is_dataclass(origin_typ): |
||||
setattr(cls, name, field(default_factory=origin_typ)) |
||||
elif origin_typ is None: |
||||
setattr(cls, name, field(default=origin_typ)) |
||||
elif issubclass(origin_typ, Enum): # first enum is the default |
||||
setattr(cls, name, field(default=next(iter(origin_typ)))) |
||||
else: |
||||
raise TypeError(f"Unsupported type for auto_field: {origin_typ}") |
||||
return cls |
||||
|
||||
|
||||
@dataclass |
||||
@apply_auto_fields |
||||
class CarControl: |
||||
enabled: bool = auto_field() |
||||
pts: list[int] = auto_field() |
||||
logMonoTime: list[int] = field(default_factory=lambda: [1, 2, 3]) |
||||
|
||||
|
||||
# This will now work with default values set by the decorator |
||||
car_control_instance = CarControl() |
||||
print(car_control_instance.enabled) # Should print False |
||||
print(car_control_instance.pts) # Should print [] |
Loading…
Reference in new issue