code: def assign(
      self, value: typing.Union[StringVal, str], *, wait: bool = False
  ):
      if not isinstance(value, StringVal):
          value = StringVal(value)
  
      if len(value.value) > String.MAX_VALUE_LENGTH:
          value.value = value.value[: String.MAX_VALUE_LENGTH]
  
          if not self._value_truncation_occurred:
              # the first truncation
              self._value_truncation_occurred = True
              logger.warning(
                  "Warning: string '%s' value was"
                  " longer than %s characters and was truncated."
                  " This warning is printed only once.",
                  path_to_str(self._path),
                  String.MAX_VALUE_LENGTH,
              )
  
      with self._container.lock():
          self._enqueue_operation(
              self.create_assignment_operation(self._path, value.value),
              wait=wait,
          )
  
file_path: neptune-client/src/neptune/attributes/atoms/string.py
imports: import typing
  from neptune.attributes.atoms.copiable_atom import CopiableAtom
  from neptune.internal.container_type import ContainerType
  from neptune.internal.operation import AssignString
  from neptune.internal.utils.logger import logger
  from neptune.internal.utils.paths import path_to_str
  from neptune.types.atoms.string import String
label_desc: Use image node_id 4 for calling the String obj's underlying member method code with example usage: obj.assign(value) without return types