Вопрос-Ответ

What's the canonical way to check for type in Python?

Каков канонический способ проверки типа в Python?

Как мне проверить, принадлежит ли объект заданному типу или он наследуется от данного типа?

Как мне проверить, имеет ли объект o тип str?


Новички часто ошибочно ожидают, что строка уже будет "числом" - либо ожидая, что Python 3.x input преобразует тип, либо ожидая, что строка типа '1' является одновременно целым числом. Это неправильный канонический способ для этих вопросов. Пожалуйста, внимательно прочитайте вопрос, а затем используйте Как мне проверить, представляет ли строка число (float или int)?, Как я могу считывать входные данные как числа? и / или Запрашивать у пользователя входные данные до тех пор, пока он не выдаст правильный ответ соответствующим образом.

Переведено автоматически
Ответ 1

Используйте, isinstance чтобы проверить, является ли o экземпляром str или любым подклассом str:

if isinstance(o, str):

Чтобы проверить, является ли тип o точным str, исключая подклассы str:

if type(o) is str:

Смотрите Встроенные функции в справочнике по библиотеке Python для получения соответствующей информации.


Проверка наличия строк в Python 2

Для Python 2 это лучший способ проверить, является ли o строкой:

if isinstance(o, basestring):

потому что это также будет перехватывать строки Unicode. unicode не является подклассом str; оба str и unicode являются подклассами basestring. В Python 3 он basestring больше не существует, поскольку существует строгое разделение строк (str) и двоичных данных (bytes).

В качестве альтернативы, isinstance принимает кортеж классов. Это вернет, True если o является экземпляром любого подкласса любого из (str, unicode):

if isinstance(o, (str, unicode)):
Ответ 2

Самый питоновский способ проверки типа объекта... не проверять его.

Поскольку Python поощряет утиный ввод, вы должны просто try...except использовать методы объекта так, как вы хотите их использовать. Итак, если ваша функция ищет файловый объект с возможностью записи, не проверяйте, что это подкласс file, просто попробуйте использовать его .write() метод!

Конечно, иногда эти приятные абстракции ломаются, и isinstance(obj, cls) это то, что вам нужно. Но используйте экономно.

Ответ 3

isinstance(o, str) вернет, True если o это str или имеет тип, который наследуется от str.

type(o) is str вернет True тогда и только тогда, когда o является str. Он вернет, False если o имеет тип, который наследуется от str.

Ответ 4

В Python 3.10 вы можете использовать | в isinstance:

>>> isinstance(1223, int | str) 
True

>>> isinstance('abcd', int | str)
True
python