如何检查变量是否是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)
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)
这是一个很好的问题,但不幸的是,投票最多的答案是一个糟糕的建议,type(obj)是dict
。
(请注意,也不应将dict
用作变量名-它是内置对象的名称。)
如果您编写的代码将被其他人导入和使用,不要假设他们将直接使用判决内置——这样的假设会使您的代码更加不灵活,在这种情况下,会创建容易隐藏的错误,不会出错。
我强烈建议,为了未来用户的正确性、可运维性和灵活性,当代码中有更灵活的惯用表达式时,不要在代码中使用更不灵活的单项表达式。
is
是对对象标识的测试。它不支持继承,不支持任何抽象,也不支持接口。
因此,我将提供几个选项。
这是我要提出的第一个建议,因为它允许用户从collections模块提供自己的dict子类,或一个OrderedDict
、defaultdict
,或计数器
:
如果是实例(any_object,判决):
但是还有更灵活的选择。
from collections.abc import Mapping
if isinstance(any_object, Mapping):
这允许代码的用户使用他们自己的抽象映射的自定义实现,其中还包括dict
的任何子类,并且仍然可以获得正确的行为。
您通常会听到OOP建议,“编程到接口”。
此策略利用Python的多态性或duck类型。
因此,只要尝试访问接口,捕获特定的预期错误(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: ...
也许您可能会认为使用像这样的duck类型在允许太多误报方面走得太远了,这可能取决于您对这段代码的目标。
不要使用is
检查标准控制流的类型。使用<代码> iStase,考虑抽象,如<代码>映射< /COD>或<代码> MutableMapping < /C>,并考虑使用接口直接避免类型检查。
您可以使用,如果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]中使用。如果需要,请参阅其他答案以了解如何处理这些问题。