code: def unicode_props(self, props, value, in_group=False, negate=False):
          
  
          # `'GC = Some_Unpredictable-Category Name' -> 'gc=someunpredictablecategoryname'`
          category = None
  
          # `\p{^negated}` Strip off the caret after evaluation.
          if props.startswith("^"):
              negate = not negate
          if props.startswith("^"):
              props = props[1:]
  
          # Get the property and value.
          # If a property is present and not block,
          # we can assume `GC` as that is all we support.
          # If we are wrong it will fail.
          if value:
              if _uniprops.is_enum(props):
                  category = props
                  props = value
              elif value in ('y', 'yes', 't', 'true'):
                  category = 'binary'
              elif value in ('n', 'no', 'f', 'false'):
                  category = 'binary'
                  negate = not negate
              else:
                  raise ValueError('Invalid Unicode property!')
  
          v = _uniprops.get_unicode_property(("^" if negate else "") + props, category, self.is_bytes)
          if not in_group:
              if not v:
                  v = '^%s' % ('\x00-\xff' if self.is_bytes else _uniprops.UNICODE_RANGE)
              v = "[%s]" % v
          properties = [v]
  
          return properties
docs: Insert Unicode properties.
  
          Unicode properties are very forgiving.
          Case doesn't matter and `[ -_]` will be stripped out.