"""Raise if a task is neither mapped nor has any parent mapped groups."""
class AbstractOperator(Templater, DAGNode):
    """Common implementation for operators, including unmapped and mapped.
    This base class is more about sharing implementations, not defining a common
    interface. Unfortunately it's difficult to use this as the common base class
    for typing due to BaseOperator carrying too much historical baggage.
    The union type ``from airflow.models.operator import Operator`` is easier
    to use for typing purposes.
    :meta private:
    """
    operator_class: type[BaseOperator] | dict[str, Any]
    weight_rule: str
    priority_weight: int
    
    operator_extra_links: Collection[BaseOperatorLink]
    owner: str
    task_id: str
    outlets: list
    inlets: list
    HIDE_ATTRS_FROM_UI: ClassVar[frozenset[str]] = frozenset(
        (
            "log",
            "dag",  
            "node_id",  
            "task_group",  
            "inherits_from_empty_operator",