docs: def parse_utuple(s,urx,length=2):
      '''parse a string into a list of a uniform type'''
      if type(urx) != str:
          urx=urx.pattern;
      if length is not None and length < 1:
          raise ValueError("invalid length: {}".format(length));
      if length == 1:
          rx = r"^ *\( *{urx} *,? *\) *$".format(urx=urx);
      elif length is None:
          rx = r"^ *\( *(?:{urx} *, *)*{urx} *,? *\) *$".format(urx=urx);
      else:
          rx = r"^ *\( *(?:{urx} *, *){{{rep1}}}{urx} *,? *\) *$".format(
              rep1=length-1,
              urx=urx);
      return re.match(rx,s);