Cattrs is currently only used in two places: Serialization for operator extra links, and for Lineage.

However cattrs is not a well maintained project and doesn't support many features that attrs itself does; in short, it's not worth the brain cycles to keep cattrs.
elif type_ == DAT.XCOM_REF:
            return _XComRef(var)  
        elif type_ == DAT.DATASET:
            return Dataset(**var)
        elif type_ == DAT.SIMPLE_TASK_INSTANCE:
            return SimpleTaskInstance(**cls.deserialize(var))
        elif type_ == DAT.CONNECTION:
            return Connection(**var)
        elif use_pydantic_models and _ENABLE_AIP_44:
            if type_ == DAT.BASE_JOB:
                return JobPydantic.parse_obj(var)
            elif type_ == DAT.TASK_INSTANCE:
                return TaskInstancePydantic.parse_obj(var)
            elif type_ == DAT.DAG_RUN:
                return DagRunPydantic.parse_obj(var)
            elif type_ == DAT.DAG_MODEL:
                return DagModelPydantic.parse_obj(var)
            elif type_ == DAT.DATA_SET:
                return DatasetPydantic.parse_obj(var)
        elif type_ == DAT.ARG_NOT_SET:
            return NOTSET
        else:
            raise TypeError(f"Invalid type {type_!s} in deserialization.")
    _deserialize_datetime = pendulum.from_timestamp
    _deserialize_timezone = pendulum.tz.timezone
    @classmethod
    def _deserialize_timedelta(cls, seconds: int) -> datetime.timedelta:
        return datetime.timedelta(seconds=seconds)
    @classmethod
    def _is_constructor_param(cls, attrname: str, instance: Any) -> bool: