Я хотел бы выполнить операцию над аргументом, основываясь на том факте, что это может быть объект типа карты или объект типа последовательности. Я понимаю, что ни одна стратегия не будет на 100% надежной для проверки типа, но я ищу надежное решение.
На основании этого ответа я знаю, как определить, является ли что-то последовательностью, и могу выполнить эту проверку после проверки, является ли объект картой.
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
Поскольку последовательность можно рассматривать как карту, где ключи являются целыми числами, я должен просто попытаться найти ключ, который не является целым числом? Или, может быть, я мог бы посмотреть на строковое представление? или ...?
UPDATE
Я выбрал ответ SilentGhost, потому что он выглядит наиболее «правильным», но для моих нужд вот решение, которое я в итоге реализовал:
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
По сути, я не хочу полагаться на ABC, потому что есть много пользовательских классов, которые ведут себя как последовательности и словарь, но все еще не расширяют ABC коллекций python (см. Комментарий @Manoj). Я думал, что атрибут ключей (упомянутый кем-то, кто удалил его / ее ответ) был достаточно хорошим проверкой для сопоставлений.
Классы, расширяющие Азбуку последовательности и сопоставления, также будут работать с этим решением.