E 'perché si deve scrivere
s="hello"
type(s) == type("")
tipo accetta un'istanza e restituisce il suo tipo. In questo caso devi confrontare due tipi di istanze.
Se è necessario eseguire il controllo preventivo, è meglio controllare un'interfaccia supportata rispetto al tipo.
Il tipo in realtà non ti dice molto, a parte il fatto che il tuo codice vuole un'istanza di un tipo specifico, indipendentemente dal fatto che potresti avere un'altra istanza di un tipo completamente diverso che andrebbe perfettamente bene perché implementa la stessa interfaccia
Ad esempio, si supponga di avere questo codice
def firstElement(parameter):
return parameter[0]
Ora, supponiamo che tu dici: io voglio questo codice per accettare solo una tupla.
import types
def firstElement(parameter):
if type(parameter) != types.TupleType:
raise TypeError("function accepts only a tuple")
return parameter[0]
Questo riduce la riusabilità di questa routine. Non funzionerà se passi una lista, una stringa o un numpy.array.Qualcosa di meglio sarebbe
def firstElement(parameter):
if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
raise TypeError("interface violation")
return parameter[0]
ma non c'è nessun punto nel farlo: parametro [0] solleverà un'eccezione se il protocollo non è soddisfatto comunque ... questo, naturalmente, a meno che non si vuole impedire che gli effetti collaterali o di dover recuperare dalle chiamate che è possibile richiamare prima di non riuscire. (Stupido) esempio, solo per fare il punto:
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 questo caso, il codice solleverà un'eccezione prima di eseguire il() chiamata di sistema. Senza i controlli dell'interfaccia, avresti rimosso il file e quindi sollevato l'eccezione.
Direi che (l'OP) dovrebbe * sicuramente * leggere il link di riferimento, che fornisce molti dettagli sul perché il controllo del tipo di un oggetto è di solito una cattiva idea, e quello che probabilmente dovresti fare invece. –
dalla memoria isinstance (obj, basestring) preleverà anche stringhe unicode ... –
dovresti usare basestr, non str. altrimenti non sceglierai unicode. (anche se per 3.x penso che str * sia * the basestr) – hasen