如何检查变量是否是Python中的字典?

时间:2014-08-10 19:01:52

标签: python dictionary

如何检查变量是否是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)

5 个答案:

答案 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模块中的OrderedDictdefaultdictCounter子类:

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,考虑像MappingMutableMapping这样的抽象,并考虑完全避免使用直接使用该接口的类型检查。

答案 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__() == '{}')