Определить тип объекта Python
Определите тип объекта с помощью type
>>> obj = object()
>>> type(obj)
<class 'object'>
Хотя это работает, избегайте атрибутов двойного подчеркивания, таких как __class__
- они не являются семантически открытыми, и, хотя, возможно, и не в этом случае, встроенные функции обычно ведут себя лучше.
>>> obj.__class__ # avoid this!
<class 'object'>
проверка типа
Есть ли простой способ определить, является ли переменная списком, словарем или чем-то еще? Я возвращаю объект, который может быть любого типа, и я должен быть в состоянии отличить.
Ну, это другой вопрос, не используйте тип - используйте isinstance
:
def foo(obj):
"""given a string with items separated by spaces,
or a list or tuple,
do something sensible
"""
if isinstance(obj, str):
obj = str.split()
return _foo_handles_only_lists_or_tuples(obj)
Это относится к случаю, когда ваш пользователь может делать что-то умное или разумное путем str
создания подклассов - согласно принципу подстановки Лискова, вы хотите иметь возможность использовать экземпляры подкласса, не нарушая свой код, - и isinstance
поддерживает это.
Используйте Абстракции
Более того, вы можете искать конкретный абстрактный базовый класс из collections
или numbers
:
from collections import Iterable
from numbers import Number
def bar(obj):
"""does something sensible with an iterable of numbers,
or just one number
"""
if isinstance(obj, Number): # make it a 1-tuple
obj = (obj,)
if not isinstance(obj, Iterable):
raise TypeError('obj must be either a number or iterable of numbers')
return _bar_sensible_with_iterable(obj)
Или просто явно не проверяйте тип
Или, может быть, лучше всего, использовать Duck-типирование и не проверять код явно. Duck-typing поддерживает Liskov Substitution более элегантно и менее многословно.
def baz(obj):
"""given an obj, a dict (or anything with an .items method)
do something sensible with each key-value pair
"""
for key, value in obj.items():
_baz_something_sensible(key, value)
Вывод
- Используйте,
type
чтобы фактически получить класс экземпляра.
- Используется
isinstance
для явной проверки на наличие подклассов или зарегистрированных абстракций.
- И просто избегайте проверки типов там, где это имеет смысл.