code: def make_attributes(s, gff3=True, keep_attr_order=True):
      
      if gff3:
          """
          hack: temporarily replace the '+' sign in the attributes column
          with the string 'PlusSign' to prevent urlparse.parse_qsl() from
          replacing the '+' sign with a space
          """
          s = s.replace('+', 'PlusSign')
          d = parse_qs(s, keep_attr_order=keep_attr_order)
          for key in d:
              d[key][0] = unquote(d[key][0].replace('PlusSign', '+').replace('"', ''))
      else:
          attributes = s.split(";")
          d = DefaultOrderedDict(list) if keep_attr_order else defaultdict(list)
          for a in attributes:
              a = a.strip()
              if ' ' not in a:
                  continue
              key, val = a.split(' ', 1)
              val = unquote(val.replace('"', '').replace('=', ' ').strip())
              d[key].append(val)
  
      for key, val in d.items():
          d[key] = list(flatten([v.split(",") for v in val]))
  
      return d
docs: In GFF3, the last column is typically:
      ID=cds00002;Parent=mRNA00002;
  
      In GFF2, the last column is typically:
      Gene 22240.t000374; Note "Carbonic anhydrase"