code: def span_context_from_string(value):
      
      if type(value) is list and len(value) > 0:
          # sometimes headers are presented as arrays of values
          if len(value) > 1:
              raise SpanContextCorruptedException(
                  'trace context must be a string or array of 1: "%s"' % value)
          value = value[0]
      if not isinstance(value, six.string_types):
          raise SpanContextCorruptedException(
              'trace context not a string "%s"' % value)
      parts = value.split(':')
      if len(parts) != 4:
          raise SpanContextCorruptedException(
              'malformed trace context "%s"' % value)
      try:
          trace_id = int(parts[0], 16)
          span_id = int(parts[1], 16)
          parent_id = int(parts[2], 16)
          flags = int(parts[3], 16)
          if trace_id < 1 or span_id < 1 or parent_id < 0 or flags < 0:
              raise SpanContextCorruptedException(
                  'malformed trace context "%s"' % value)
          if parent_id == 0:
              parent_id = None
          return trace_id, span_id, parent_id, flags
      except ValueError as e:
          raise SpanContextCorruptedException(
              'malformed trace context "%s": %s' % (value, e))
docs: Decode span ID from a string into a TraceContext.
      Returns None if the string value is malformed.
  
      :param value: formatted {trace_id}:{span_id}:{parent_id}:{flags}