当前位置: 首页 > 知识库问答 >
问题:

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

桑思远
2023-03-14

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

例如,我希望它循环遍历字典中的值,直到找到字典。然后,循环遍历它找到的那个:

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)

共有3个答案

郎刚捷
2023-03-14

OP没有排除起始变量,因此为了完整起见,这里是如何处理假定字典(可能包括作为字典的项)的一般情况。

也遵循纯Python(3.8)推荐的方法来测试上面评论中的字典。

from collections.abc import Mapping

my_dict = {'abc': 'abc', 'def': {'ghi': 'ghi', 'jkl': 'jkl'}}

def parse_dict(in_dict): 
    if isinstance(in_dict, Mapping):
        for k_outer, v_outer in in_dict.items():
            if isinstance(v_outer, Mapping):
                for k_inner, v_inner in v_outer.items():
                    print(k_inner, v_inner)
            else:
                print(k_outer, v_outer)

parse_dict(my_dict)
景修杰
2023-03-14

这是一个很好的问题,但不幸的是,投票最多的答案是一个糟糕的建议,type(obj)是dict

(请注意,也不应将dict用作变量名-它是内置对象的名称。)

如果您编写的代码将被其他人导入和使用,不要假设他们将直接使用判决内置——这样的假设会使您的代码更加不灵活,在这种情况下,会创建容易隐藏的错误,不会出错。

我强烈建议,为了未来用户的正确性、可运维性和灵活性,当代码中有更灵活的惯用表达式时,不要在代码中使用更不灵活的单项表达式。

is是对对象标识的测试。它不支持继承,不支持任何抽象,也不支持接口。

因此,我将提供几个选项。

这是我要提出的第一个建议,因为它允许用户从collections模块提供自己的dict子类,或一个OrderedDictdefaultdict,或计数器

如果是实例(any_object,判决):

但是还有更灵活的选择。

from collections.abc import Mapping

if isinstance(any_object, Mapping):

这允许代码的用户使用他们自己的抽象映射的自定义实现,其中还包括dict的任何子类,并且仍然可以获得正确的行为。

您通常会听到OOP建议,“编程到接口”。

此策略利用Python的多态性或duck类型。

因此,只要尝试访问接口,捕获特定的预期错误(AttributeError如果没有。itemsTypeError如果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: ...

也许您可能会认为使用像这样的duck类型在允许太多误报方面走得太远了,这可能取决于您对这段代码的目标。

不要使用is检查标准控制流的类型。使用<代码> iStase,考虑抽象,如<代码>映射< /COD>或<代码> MutableMapping < /C>,并考虑使用接口直接避免类型检查。

龙永逸
2023-03-14

您可以使用,如果type(ele)是dico,或者使用is实例(ele,dico),如果您子类化了dico,这将起作用:

d = {'abc': 'abc', 'def': {'ghi': 'ghi', 'jkl': 'jkl'}}
for element in d.values():
    if isinstance(element, dict):
       for k, v in element.items():
           print(k,' ',v)
 类似资料:
  • 如何检查变量是否是Python中的字典? 例如,我希望它循环遍历字典中的值,直到找到字典。然后,循环遍历它找到的那个:

  • 问题内容: 我想检查一个变量是否存在。现在我正在做这样的事情: 是否有其他方法无一例外? 问题答案: 要检查是否存在局部变量: 要检查是否存在全局变量: 要检查对象是否具有属性:

  • 问题内容: 我想知道如何检查变量是否是类(不是实例!)。 我试图使用该函数来执行此操作,但我不知道类将具有哪种类型。 例如,在以下代码中 我试图用 ??? 代替“ ” ,但我意识到这是python中的关键字。 问题答案: 更好的是:使用该功能。

  • 问题内容: 如何检查变量是否为整数? 问题答案: 如果你需要这样做,请执行 除非你使用的是Python 2.x,否则需要 不要使用type。在Python中,这几乎永远不是正确的答案,因为它阻止了多态性的所有灵活性。例如,如果你子类化int,则你的新类应注册为int,但type不会这样做: 这符合Python强大的多态性:你应该允许行为类似于的任何对象int,而不是强制将其作为一个对象。 BUT

  • 问题内容: 我发现一些旧的Python代码正在执行以下操作: 不出所料,有人抱怨建议使用。 现在的问题是,该模块已添加到Python 2.6中,我需要编写适用于Python 2.5+的代码 所以不是解决方案。 在这种情况下,哪种解决方案合适? 问题答案: 在Python 2中,您可以使用模块: 请注意使用元组来测试多种类型。 在幕后,只是的别名,等等: 该类型要求您的python编译时支持复数;如

  • 问题内容: 如何确定变量是字符串还是JavaScript中的其他内容? 问题答案: 您可以使用运算符: 在使用创建的字符串的情况下,这将无法正常工作,但很少使用,建议在[1][2]中使用。如果需要,请参阅其他答案以了解如何处理这些问题。