Vai avanti e usa isinstancese ne hai bisogno. È in qualche modo malvagio, in quanto esclude sequenze personalizzate, iteratori e altre cose di cui potresti effettivamente aver bisogno. Tuttavia, a volte è necessario comportarsi diversamente se qualcuno, ad esempio, passa una stringa. La mia preferenza sarebbe quella di verificare esplicitamente stro unicodesimili:
import types
isinstance(var, types.StringTypes)
NB non sbaglio types.StringTypeper types.StringTypes. Quest'ultimo incorpora stre unicodeoggetti.
Il typesmodulo è considerato da molti obsoleto a favore del solo controllo diretto rispetto al tipo di oggetto, quindi se preferisci non utilizzare quanto sopra, puoi alternativamente verificare esplicitamente contro stre unicode, in questo modo:
isinstance(var, (str, unicode)):
Modificare:
Meglio ancora è:
isinstance(var, basestring)
Termina modifica
Dopo uno di questi, puoi ricominciare a comportarti come se avessi una sequenza normale, lasciando che le non-sequenze sollevino le opportune eccezioni.
Vedere la cosa "cattiva" nel controllo dei tipi non è che potresti voler comportarti diversamente per un certo tipo di oggetto, è che limiti artificialmente la tua funzione dal fare la cosa giusta con tipi di oggetti inaspettati che altrimenti farebbero la cosa giusta. Se si dispone di un fallback finale che non è stato verificato, si rimuove questa restrizione. Va notato che un eccessivo controllo del tipo è un odore di codice che indica che potresti voler eseguire un refactoring, ma ciò non significa necessariamente che dovresti evitarlo dal getgo.