Вступление
Переменные действуют как контейнер для хранения данных. Разработчик может использовать подсказки типа при создании переменных или передаче аргументов, однако это необязательная функция в Python, и многие кодовые базы, старые и новые, еще не имеют их. Чаще всего переменная в Python не имеет информации о сохраняемом типе.
Если бы у нас был код, который нуждался в словаре, но не имел подсказок типа, как мы можем избежать ошибок, если используемая переменная не является словарем?
В этом руководстве мы рассмотрим, как проверить, является ли переменная
словарем в Python , используя функции type() и isinstance() , а
также оператор is
- Проверьте, является ли переменная Dictionary с type ()
- Проверьте, является ли переменная Dictionary с оператором is
- Проверьте, является ли переменная Dictionary с помощью isinstance ()
Разработчики обычно используют type() и is , однако, они могут быть
ограничены в определенных контекстах, в этом случае, это лучше
использовать isinstance() функцию.
Убедитесь, что переменная является словарем с типом ()
Мы можем использовать type() чтобы мгновенно получить тип любой
переменной. Для переменной типа Dictionary она должна возвращать
<class 'dict'> :
squares = {1: 1, 2: 4, 3: 9}
print(type(squares))
Это приводит к:
<class 'dict'>
Проверьте, является ли переменная словарем с оператором is
В Python, is является тождественным оператором. Он проверяет
идентичность обоих операндов друг другу. Идентичность означает, что они
относятся к одной и той же ячейке памяти.
Мы можем использовать is с результатом type() с переменной и классом
dict Он будет выводить True только если type() указывает на то же
место в памяти, что и класс dict В противном случае будет выведено
False .
В качестве проверки id() чтобы получить адрес объекта в памяти и
проверить сравнение:
squares = {1: 1, 2: 4, 3: 9}
print(type(squares) is dict) # True
print("memory address of type(squares):", id(type(squares)))
print("memory address of dict:", id(dict)) # Should have same ID as type(squares)
Этот код будет производить следующий вывод в интерпретаторе Python:
True
memory address of type(squares): 1609576584
memory address of dict: 1609576584
Примечание. Адрес памяти может быть разным, но для type(squares) и
dict должен быть одинаковый идентификатор.
Одним из недостатков этого метода является то, что он не работает, если
переменная является подклассом dict . Например, предыдущий код не
работал бы, если бы вместо переменной squares был упорядоченный
словарь:
from collections import OrderedDict
squares = OrderedDict([(1, 1), (2, 4), (3, 9)])
print(type(squares) is dict) # False
print("memory address of type(squares):", id(type(squares)))
print("memory address of dict:", id(dict)) # Different ID as they're different classes
Это выводит:
False
memory address of type(squares): 9464512
memory address of dict: 9481952
Если ваш код требуется для работы с подклассами словарей, вы бы
предпочли использовать метод isinstance() .
Проверьте, является ли переменная словарём с isinstance ()
Как мы видели, оператор is True если адреса памяти обоих объектов
одинаковы. Если у нас есть словарь типа, унаследованного от класса
dict , он вернет False . Например, словарь подкласса dict такого
как OrderedDict или defaultdict , не будет указывать на тот же адрес
памяти, что и dict .
Здесь нам на помощь приходит функция isinstance() Эта функция
принимает два аргумента; объект и класс. Если объект является
экземпляром класса или его подклассов, он вернет True . Если объект не
является экземпляром данного класса, будь то прямой или косвенный, он
возвращает False .
Вот пример кода, чтобы проверить, является ли переменная словарем с
помощью функции isinstance() :
from collections import OrderedDict
# Variable of type dict
squares = {1: 1, 2: 4, 3: 9}
print(isinstance(squares, dict)) # True
# Variable of type OrderedDict (Subclass of dict)
cubes = OrderedDict(((1, 1), (2, 8)))
print(isinstance(cubes, dict)) # True
Этот код будет производить следующий вывод в интерпретаторе Python:
True
True
Заключение
В этом руководстве показаны способы проверки того, является ли
переменная словарем. Мы впервые увидели type() которая выводит
<class 'dict'> для любого объекта Dictionary. Затем мы увидели
использование is для проверки того, указывает ли тип переменной на
dict в ячейке памяти. Это возвращает True или False
соответственно.
И, наконец, мы увидели , что is не удается при определении
унаследованных объектов словаря. Когда мы хотим захватить унаследованные
объекты, мы можем использовать isinstance() . Он возвращает True
если объект прямо или косвенно является экземпляром данного класса (
dict в этой статье), и False противном случае.
Поскольку оба эти метода возвращают True или False , мы можем легко
использовать их в условных операторах. Если вы явно не хотите отклонить
подклассы dict , isinstance() - самый надежный способ проверить,
является ли переменная словарем.