Python: проверьте, является ли переменная словарем

Введение Переменные действуют как контейнер для хранения данных. Разработчик может использовать подсказки типа при создании переменных или передаче аргументов, однако это необязательная функция в Python, и многие кодовые базы, старые и новые, еще не имеют их. Чаще всего переменная в Python не имеет информации о сохраняемом типе. Если бы у нас был код, который нуждался в словаре, но не имел подсказок по типу, как мы могли бы избежать ошибок, если используемая переменная не является словарем? В этом уроке мы рассмотрим хо

Вступление

Переменные действуют как контейнер для хранения данных. Разработчик может использовать подсказки типа при создании переменных или передаче аргументов, однако это необязательная функция в Python, и многие кодовые базы, старые и новые, еще не имеют их. Чаще всего переменная в Python не имеет информации о сохраняемом типе.

Если бы у нас был код, который нуждался в словаре, но не имел подсказок типа, как мы можем избежать ошибок, если используемая переменная не является словарем?

В этом руководстве мы рассмотрим, как проверить, является ли переменная словарем в Python , используя функции type() и isinstance() , а также оператор is

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

comments powered by Disqus