Как чтобы различать последовательность и отображение

Я хотел бы выполнить операцию с аргументом на основании того факта, что это может быть объект, подобный карте, или объект, подобный последовательности . Я понимаю, что ни одна стратегия не будет на 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 последовательности и отображения, также будут работать с этим решением.

6
задан Community 23 May 2017 в 12:06
поделиться