Es ist, weil Sie schreiben müssen
s="hello"
type(s) == type("")
Typ akzeptiert eine Instanz und gibt ihren Typ zurück. In diesem Fall müssen Sie die Typen zweier Instanzen vergleichen.
Wenn Sie eine vorbeugende Prüfung durchführen müssen, ist es besser, wenn Sie nach einer unterstützten Schnittstelle suchen als nach dem Typ.
Der Typ sagt nicht wirklich viel aus, abgesehen von der Tatsache, dass Ihr Code eine Instanz eines bestimmten Typs möchte, unabhängig davon, dass Sie eine andere Instanz eines völlig anderen Typs haben könnten, was vollkommen in Ordnung wäre, da es dieselbe Schnittstelle implementiert .
Angenommen, Sie haben diesen Code
def firstElement(parameter):
return parameter[0]
Angenommen, Sie sagen: Ich möchte, dass dieser Code nur ein Tupel akzeptiert.
import types
def firstElement(parameter):
if type(parameter) != types.TupleType:
raise TypeError("function accepts only a tuple")
return parameter[0]
Dies verringert die Wiederverwendbarkeit dieser Routine. Es funktioniert nicht, wenn Sie eine Liste, einen String oder ein numpy.array übergeben. Etwas besseres wäre
def firstElement(parameter):
if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
raise TypeError("interface violation")
return parameter[0]
Aber es macht keinen Sinn, dies zu tun: Parameter [0] löst eine Ausnahme aus, wenn das Protokoll ohnehin nicht erfüllt ist ... dies natürlich, es sei denn, Sie möchten Nebenwirkungen verhindern oder müssen sich von Aufrufen erholen, die Sie aufrufen könnten, bevor Sie fehlschlagen. (Dummes) Beispiel, nur um den Punkt zu machen:
def firstElement(parameter):
if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
raise TypeError("interface violation")
os.system("rm file")
return parameter[0]
In diesem Fall löst Ihr Code eine Ausnahme aus, bevor der system () -Aufruf ausgeführt wird. Ohne Schnittstellenprüfungen hätten Sie die Datei entfernt und dann die Ausnahme ausgelöst.
type(obj) == str