Was immer ihr gemacht habt: Generell sollte man so weit wie möglich vermeiden, Typprüfungen zu machen. Teil der objektorientierten Philosophie ist es, sich mehr dafür zu interessieren, was ein Objekt kann und nicht so sehr, was es ist. Pythonesk ist es also, einfach mal eine Methode auf ein Objekt anzuwenden. Wenn das Objekt nicht kann, was man von ihm will, bekommt man einen AttributeError (oder, wenn man Funktionen wie len und Freunde verwendet, auch mal einen ValueError oder einen TypeError) und kann dann immer noch Massnahmen zur Fehlerbehebung einleiten.

Der Vorteil dieses Verfahrens ist, dass eure Funktionen dann garantiert auf alle Objekte gehen, auf die sie sinnvoll andwendbar sind.

Um euch eine Idee zu geben, wie das laufen könnte:

def _addIntable(someInt, intableObj):
  return someInt+int(intableObj)

def _addFloatable(someInt, floatableObj):
  return someInt+float(floatableObj)

def _addSeq(someInt, objWithLength):
  return someInt+len(objWithLength)

def _addOther(someInt, someObj):
  return someInt+id(someObj)

def addTo(someInt, someObj):
  for fun in [_addIntable, _addFloatable, _addSeq, _addOther]:
    try:
      return fun(someInt, someObj)
    except (AttributeError, ValueError, TypeError):
      pass
  raise Exception("Yikes: Can’t add %s"%someObj)