Я хотел бы выполнить операцию с аргументом на основании того факта, что это может быть объект, подобный карте, или объект, подобный последовательности . Я понимаю, что ни одна стратегия не будет на 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
Поскольку последовательность можно рассматривать как карту, где ключи являются целыми числами, должен ли я просто попытаться найти ключ, который не является целым числом? Или, может быть, я мог бы посмотреть на строковое представление? или ...?
ОБНОВЛЕНИЕ
Я выбрал ответ 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). Я думал, что атрибут ключей (упомянутый кем-то, кто удалил свой ответ) был достаточно хорошей проверкой сопоставлений.
Классы, расширяющие ABC последовательности и отображения, также будут работать с этим решением.