Je voudrais effectuer une opération sur un argument basé sur le fait qu'il pourrait s'agir d'un objet de type carte ou d'un objet de type séquence. Je comprends qu'aucune stratégie ne sera fiable à 100% pour la vérification type, mais je cherche une solution robuste.Comment faire la distinction entre une séquence et un mappage
Basé sur ce answer, je sais comment déterminer si quelque chose est une séquence et je peux faire cette vérification après avoir vérifié si l'objet est une carte.
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
Parce qu'une séquence peut être considérée comme une carte où les clés sont des nombres entiers, dois-je juste essayer de trouver une clé qui est pas un entier? Ou peut-être que je pourrais regarder la représentation de la chaîne? ou...?
MISE À JOUR
Je choisis la réponse de SilentGhost parce qu'il ressemble le plus « correct » un, mais pour mes besoins, voici la solution que je fini par mettre en œuvre:
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
Essentiellement, je ne veulent pas s'appuyer sur un ABC car il y a beaucoup de classes personnalisées qui se comportent comme des séquences et des dictionnaires mais qui ne prolongent pas les ABCs des collections python (voir commentaire @Manoj). Je pensais que l'attribut de clés (mentionné par quelqu'un qui a supprimé sa réponse) était un assez bon contrôle pour les mappings.
Les classes qui étendent les ABC de séquence et de mappage fonctionneront également avec cette solution.
Pourquoi ne pas simplement essayer séquence quelque chose comme ou carte comme, et sur la base des erreurs, vous pouvez déterminer ce qu'il faut le traiter comme. – PyRulez