Vorrei eseguire un'operazione su un argomento basato sul fatto che potrebbe essere un oggetto simile a una mappa o un oggetto simile a una sequenza. Capisco che nessuna strategia sarà affidabile al 100% per il controllo di tipo, ma sto cercando una soluzione robusta.Come distinguere tra una sequenza e una mappatura
Sulla base di questo answer, so come determinare se qualcosa è una sequenza e posso eseguire questo controllo dopo aver controllato se l'oggetto è una mappa.
def ismap(arg):
# How to implement this?
def isseq(arg):
return hasattr(arg,"__iter__")
def operation(arg):
if ismap(arg):
# Do something with a dict-like object
elif isseq(arg):
# Do something with a sequence-like object
else:
# Do something else
Perché una sequenza può essere vista come una mappa in cui chiavi sono interi, devo solo cercare di trovare una chiave che non è un intero? O forse potrei guardare la rappresentazione delle stringhe? o...?
UPDATE
ho scelto la risposta di SilentGhost perché sembra la più "corretto", ma per le mie esigenze, ecco la soluzione ho finito per applicazione:
if hasattr(arg, 'keys') and hasattr(arg, '__getitem__'):
# Do something with a map
elif hasattr(arg, '__iter__'):
# Do something with a sequence/iterable
else:
# Do something else
In sostanza, ho non voglio fare affidamento su un ABC perché ci sono molte classi personalizzate che si comportano come sequenze e dizionari ma che non estendono ancora le collezioni Python ABC (vedi commento @Manoj). Ho pensato che l'attributo delle chiavi (menzionato da qualcuno che ha rimosso la sua/la sua risposta) era un controllo abbastanza buono per i mapping.
Le classi che estendono la sequenza e la mappatura degli ABC funzionano anche con questa soluzione.
Perché non provare qualcosa di simile sequenza o una mappa simile, e sulla base degli errori, è possibile determinare quali di trattarlo come. – PyRulez