Hat man sich erst einmal darauf geeinigt, dass man einfach so weitermacht wie bei den hexadezimalen Ziffern, ist der Rest nicht mehr schwer, weil die Basen nur an wenigen Stellen eine Rolle spielen:

import string

def anyToInt(digitStr, base=16):
  res = 0
  for digit in digitStr:
    res *= base
    if digit in string.digits:
      res += int(digit)
    elif digit in string.ascii_lowercase:
      res += ord(digit)-ord('a')+10
    elif digit in string.ascii_uppercase:
      res += ord(digit)-ord('A')+10
  return res

def intToAny(number, base=16):
  digits = string.digits+string.lowercase
  res = []
  while number>0:
    curRem = number%base
    res.append(string.hexdigits[curRem])
    number /= base
  res.reverse()
  return "".join(res)

In dieser Fassung wandeln die Funktionen auch mühelos nach binär. Probiert mal aus, wie die Zweierpotenzen aussehen, die um eins reduzierten Zweierpotenzen usf. Wie sehen die Zweierpotenzen Hexadezimal aus, wie Oktal (also zur Basis 8)? Wie verhält sich die Zahl der Stellen einer Zahl zur Basis 32 zu der Zahl der Stellen zur Basis 16?

Übrigens wäre die schnelle Lösung für anyToInt gewesen:

anyToInt = int

Warum, bekommt ihr mit pydoc int heraus. Eine in Python eingebaute Funktion, die die Umkehrung davon macht, ist mir nicht bekannt.