code: def extend(
      self,
      values: Union[Collection[DataTV], StringifyValue],
      steps: Optional[Collection[float]] = None,
      timestamps: Optional[Collection[float]] = None,
      wait: bool = False,
      **kwargs,
  ) -> None:
      if is_stringify_value(values):
          values = self._handle_stringified_value(values)
  
      if steps is not None:
          verify_collection_type("steps", steps, (float, int))
          if len(steps) != len(values):
              raise ValueError(
                  f"Number of steps must be equal to number of values ({len(steps)} != {len(values)}"
              )
  
      if timestamps is not None:
          verify_collection_type("timestamps", timestamps, (float, int))
          if len(timestamps) != len(values):
              raise ValueError(
                  f"Number of timestamps must be equal to number of values ({len(timestamps)} != {len(values)}"
              )
  
      value = self._data_to_value(
          values, steps=steps, timestamps=timestamps, **kwargs
      )
      ops = self._get_log_operations_from_value(value)
  
      with self._container.lock():
          for op in ops:
              self._enqueue_operation(op, wait=wait)
  
imports: import abc
  from typing import Collection, Generic, Iterable, List, Optional, TypeVar, Union
  from neptune.attributes.attribute import Attribute
  from neptune.internal.operation import LogOperation
  from neptune.internal.types.stringify_value import StringifyValue
  from neptune.internal.utils import is_collection, is_stringify_value, verify_collection_type, verify_type
  from neptune.internal.utils.iteration import get_batches
  from neptune.types.series.series import Series
label_desc: Use image node_id 12 for calling the Series obj's underlying member method code with example usage: obj.extend(values, steps, timestamps, wait) without return types