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