如何检查变量是否是python中的字典?
例如id喜欢它循环遍历字典中的值,直到它找到一个字典,然后遍历它找到的字典:
dict = {'abc':'abc','def':{'ghi':'ghi','jkl':'jkl'}}
for k, v in dict.iteritems():
if ###check if v is a dictionary:
for k, v in v.iteritems():
print(k,' ',v)
else:
print(k,' ',v)
答案 0 :(得分:161)
您可以使用if type(ele) is dict
或使用isinstance(ele, dict),如果您已经 dict ,则可以使用{/ 3>}:
d = {'abc':'abc','def':{'ghi':'ghi','jkl':'jkl'}}
for ele in d.values():
if isinstance(ele,dict):
for k, v in ele.items():
print(k,' ',v)
答案 1 :(得分:31)
您如何检查变量是否为Python中的字典?
这是一个很好的问题,但不幸的是,最受支持的答案导致推荐不佳,type(obj) is dict
。
(请注意,您也不应使用dict
作为变量名-这是内置对象的名称。)
如果您正在编写将要由其他人导入和使用的代码,请不要假定他们将直接使用内置的dict-使这种假定使您的代码更加不灵活,在这种情况下,请创建容易隐藏且不会出错的错误该程序。
出于对未来用户的正确性,可维护性和灵活性的考虑,我强烈建议,当存在更灵活,惯用的表达式时,请不要在代码中使用较不灵活的单项表达式。
is
是对object identity的测试。它不支持继承,不支持任何抽象,也不支持接口。
所以我将提供几种选择。
这是我要提出的第一个建议,因为它允许用户提供自己的dict子类,或者是collections模块中的OrderedDict
,defaultdict
或Counter
子类:
if isinstance(any_object, dict):
但是还有更多灵活的选择。
from collections.abc import Mapping
if isinstance(any_object, Mapping):
这允许您的代码用户使用他们自己的抽象映射的自定义实现,其中还包括dict
的任何子类,并且仍然可以获取正确的行为。
您通常会听到OOP建议,即“对接口进行编程”。
此策略利用了Python的多态性或鸭子式输入。
因此,只需尝试访问该接口,即可捕获特定的预期错误(在没有AttributeError
的情况下捕获.items
,在无法调用TypeError
的情况下捕获items
)一个合理的后备-现在实现该接口的任何类都会为您提供其项(注意.iteritems()
在Python 3中已消失):
try:
items = any_object.items()
except (AttributeError, TypeError):
non_items_behavior(any_object)
else: # no exception raised
for item in items: ...
也许您可能会认为,使用这种鸭子式输入方式会导致过多的误报,而实际情况可能会如此,这取决于您的代码目标。
请勿使用is
检查标准控制流的类型。使用isinstance
,考虑像Mapping
或MutableMapping
这样的抽象,并考虑完全避免使用直接使用该接口的类型检查。
答案 2 :(得分:4)
OP并未排除起始变量,因此为了完整起见,这里是如何处理处理可能包含条目作为字典的假定字典的一般情况。
还要遵循纯Python(3.8)recommended way来测试上述注释中的字典。
For example : s1 = "adjsjvnejnv"
s2 = "djpppne"
答案 3 :(得分:3)
在 python 3.6 中
typeVariable = type(variable)
print('comparison',typeVariable == dict)
if typeVariable == dict:
#'true'
else:
#'false'
答案 4 :(得分:-1)
您也可以尝试这个。
d = {}
if (d.__str__() == '{}')
or
if(d.__repr__() == '{}')