How to check if a variable is a dictionary in Python?
在python中,如何检查变量是否是字典?
例如,id希望它遍历字典中的值,直到找到一个字典,然后遍历找到的字典:
1 2 3 4 5 6 7
| 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) |
- 还有stackoverflow.com/questions/378927/…(标记为上面的副本)。
- 另外stackoverflow.com/q/2225038/770830
- 不,这不是同一个问题。这个问题的答案和这里列出的其他问题的答案基本上都包含相同的信息。但是"如何检查变量是否是python中的字典"的答案是"use type()或isinstance()",这将导致一个新问题,即type()和isinstance()之间的区别是什么。但是第一个问题的人在第一个问题得到回答之前不可能知道这一点。因此,不同的问题,当你在网站上寻找你的问题时是很重要的。
- 我同意@mbakeranalecta的观点,我来这里是为了寻找"如何检查变量是否是python中的字典"这个问题的答案。我从来没有想过要把我的答案看成"Python中isInstance()和type()之间的区别"。
- 为了检查变量是否是字典,您可能应该使用isinstance(v, collections.abc.Mapping)。换句话说,这不是"isInstance()和type()之间的差异"的完全重复。
您可以使用if type(ele) is dict或isinstance(ele,dict),如果您已将dict子类化:
1 2 3 4 5
| 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) |
- 我投了反对票,因为一般问题的正确答案是:isinstance(ele, collections.Mapping)。它适用于dict()、collections.OrderedDict()和collections.UserDict()。这个问题中的例子对于帕德里亚克的答案来说已经足够具体了,但是对于一般情况来说还不够好。
- 我否决了这个答案,因为如果你要调用ele.items(),为什么要检查类型?eafp/duck类型在这里工作,只需在try...except (AttributeError, TypeError)中包装for k,v in ele.items()。如果出现异常,你知道ele没有产生一个不可数的items。
- @Padraic Cunningham你假设的边缘案例需要你的"100%不是听写"定制类1。采用items()方法2。恰好产生了一个不可数和3。其中,该iterable的每个元素都可以表示为2元组。此时,自定义对象已经实现了dict的一半。出于所列代码的目的,我们只关心嵌套元素的条件扩展,而您的自定义对象已经实现了这一点。(讽刺的是,你批评@Alexander Ryzhov的评论过于笼统,但现在却提出了一个笼统的理由)
- @padraiccunningham我不想教那些不太熟悉Python反模式的人。在python中,很少有需要显式类型检查的用例——大多数源于从继承一个错误的实现开始("上帝的对象,覆盖标准库/语言结构等")。最初的问题本身就是一个xy问题。为什么OP需要检查类型?因为根据它们的代码,它们真正想要做的是检查集合中的项是否像集合一样工作(实现生成嵌套的iterable的items())。
- @考伯特,欢迎你的意见,但事实上帕德拉克确实回答了这个问题。
- @伊桑里斯没有争论。目前有122张赞成票,我是少数几个反对票之一。我没有投反对票。因此,我已经在与温和问题作斗争,所以我宁愿改变这个非讨论性的论坛规则来评判问题/答案的"现实生活"质量,而不是仅仅是另一个"汤纳粹"。
- @Alexanderryzhov为什么不把这种方法作为答案?顺便说一句,正如Josh Kelley在上面所评论的那样,建议使用collections.abc.Mapping,注意它们可能是相同的,但是在python 3.3之前,collections.abc是不可用的。在python 3.6中仍然可以使用collections.Mapping别名,但没有文档记录,因此可能应该首选collections.abc.Maping。