code: def parse_number(self, s):
          
          start = 1 if s[0] in ["-","+"] else 0
  
          all_digits = lambda x: all(map(lambda c: c.isdigit(), x))
          ishex = lambda c: c.isdigit() or ord(c.lower()) in range(ord("a"), ord("f"))
          all_hex = lambda x: all(map(ishex, x))
  
          if all_digits(s[start:]):
              try:
                  return (Tokenizer.INTEGER, int(s))
              except ValueError:
                  raise ParseError("%d:%d: Invalid integer '%s'" % (self.lineno,
                      self.column, s))
  
          if s[start:].startswith("0x") and all_hex(s[start+2:]):
              try:
                  return (Tokenizer.INTEGER, int(s, base=16))
              except ValueError:
                  raise ParseError("%d:%d: Invalid hexadecimal integer '%s'" %
                          (self.lineno, self.column, s))
  
          if any(map(lambda c: c==".", s)) or any(map(lambda c: c=="e", s)):
              try:
                  return (Tokenizer.FLOAT, float(s))
              except ValueError:
                  raise ParseError("%d:%d: Invalid float '%s'" % (self.lineno,
                      self.column, s))
  
          raise ParseError("%d:%d: Invalid number '%s'" % (self.lineno,
              self.column, s))
docs: Parses integers in bases 10 and 16 and floats.