code: def _init_task_labels(
      dataset, task_labels, check_shape=True
  ) -> Optional[DataAttribute[int]]:
      """
      Initializes the task label list (one for each pattern in the dataset).
  
      Precedence is given to the values contained in `task_labels` if passed.
      Otherwisem the elements will be retrieved from the dataset itself by
      traversing it and looking at the `targets_task_labels` field.
  
      :param dataset: The dataset for which the task labels list must be
          initialized. Ignored if `task_labels` is passed, but it may still be
          used if `check_shape` is true.
      :param task_labels: The task labels to use. May be None, in which case
          the labels will be retrieved from the dataset.
      :param check_shape: If True, will check if the length of the task labels
          list matches the dataset size. Ignored if the labels are retrieved
          from the dataset.
      :returns: A data attribute containing the task labels. May be None to
          signal that the dataset's `targets_task_labels` field should be used
          (because the dataset is a :class:`AvalancheDataset`).
      """
      if task_labels is not None:
          # task_labels has priority over the dataset fields
          if isinstance(task_labels, int):
              task_labels = ConstantSequence(task_labels, len(dataset))
          elif len(task_labels) != len(dataset) and check_shape:
              raise ValueError(
                  "Invalid amount of task labels. It must be equal to the "
                  "number of patterns in the dataset. Got {}, expected "
                  "{}!".format(len(task_labels), len(dataset))
              )
  
          if isinstance(task_labels, ConstantSequence):
              tls = task_labels
          elif isinstance(task_labels, DataAttribute):
              tls = task_labels.data
          else:
              tls = SubSequence(task_labels, converter=int)
      else:
          task_labels = _traverse_supported_dataset(
              dataset, _select_task_labels
          )
  
          if task_labels is None:
              tls = None
          elif isinstance(task_labels, ConstantSequence):
              tls = task_labels
          elif isinstance(task_labels, DataAttribute):
              return DataAttribute(
                  task_labels.data,
                  "targets_task_labels",
                  use_in_getitem=True,
              )
          else:
              tls = SubSequence(task_labels, converter=int)
  
      if tls is None:
          return None
      return DataAttribute(
          tls, "targets_task_labels", use_in_getitem=True
      )
  
imports: from collections import OrderedDict, defaultdict, deque
  from typing import TYPE_CHECKING, Any, Callable, Generic, Iterator, List, Iterable, Mapping, Optional, Sequence, TypeVar, Union, Dict, SupportsInt
  import warnings
  import torch
  from torch import Tensor
  from torch.utils.data import Subset, ConcatDataset
  from .data import AvalancheDataset
  from .data_attribute import DataAttribute
  from .dataset_definitions import ISupportedClassificationDataset
  from .dataset_utils import SubSequence, find_list_from_index
  from .flat_data import ConstantSequence
  from .transform_groups import TransformGroupDef, TransformGroups, XTransform, YTransform
label_desc: Use image node_id 11 for calling a global function with example usage: _init_task_labels(dataset, task_labels, check_shape) and returns: DataAttribute, None, DataAttribute