Использование типизирования утки распространено в Python, поэтому проверка типа обычно не рекомендуется, если в этом нет крайней необходимости.Как правило, если аргумент должен быть определенного типа, лучше всего предположить, что пользователь предоставил правильный тип.Это позволяет пользователю предоставлять что-то, что не совсем правильно, но все еще работает, и позволяет использовать фиктивные объекты для целей тестирования.В некоторых случаях может быть полезно просто попытаться преобразовать все, что пользователь дал вам, в то, что вы хотите.В вашем примере, вы можете просто сделать: self.tagged = list(input)
.Конструктор list
будет принимать самые разные последовательности (которые пользователь может захотеть использовать, но их может быть недостаточно для ваших нужд) и составляет из него список.
Иногда, однако, вы делаетенужно некоторые вид проверки.Например, если функция должна принимать списки или указания и делать что-то другое в зависимости от того, что вы предоставили.В этих ситуациях вы можете использовать абстрактную систему базовых классов Python.См. Классы в коллекциях и числах модуля.Используя их, вы можете выполнить isinstance
проверку, чтобы увидеть, является ли что-то Sequence
, Mapping
или Number
без явного указания всех возможностей.Возможно, вы заметили, что классы list
, dict
и int
на самом деле не являются производными от Sequence
, Mapping
и Number
, но это нормально - абстрактные классы могут определить, какие классы считаютсяподклассы для целей функции isinstance
.Вы можете использовать модуль abc для определения новых абстрактных классов такого рода.Поэтому, если вам нужно выполнить много проверок для определенного набора классов, вам может быть проще и понятнее определить абстрактный класс, который утверждает, что он является его собственным.Затем, позже, вы можете добавить больше классов (или программную проверку) к абстрактному классу, чтобы охватить больше случаев без необходимости обновлять все места, где вам нужно было выполнить проверку.