Python:检查一个变量是否是一个字典

问题描述:

我很好奇,如果在检查python中的变量是字典时是否有任何明显的问题?我意识到在python中进行类型检查并不是很“pythonic”,但我不知道还有别的方法来解决我的特定问题。Python:检查一个变量是否是一个字典

下面是一个例子,我试图根据对象属性是否存在来设置对象的属性,以及b。)如果我覆盖的值是字典。如果它是一个字典,则递归该函数以设置这些子对象属性。

import six 

class OtherObj(object): 
    def __init__(self, name): 
     self.name = name 

class ExObj(object): 
    def __init__(self, name, description, other_obj): 
     self.name = name 
     self.description = description 
     self.other_obj = other_obj 

def process_dict(obj, **kwargs): 
     for key, value in six.iteritems(kwargs): 
      if hasattr(obj, key): 
       if isinstance(value, dict): 
        process_dict(getattr(obj, key), **value) 
       else: 
        setattr(obj, key, value) 

obj = ExObj("my name", "my desc", OtherObj("another name")) 
process_dict(obj, **{ "name": "no this is my real name", 
         "description": "no this is my real desc", 
         "other_obj": { "name": "other object real name" } }) 
+0

你为什么不认为这是正确的方法?你必须选择一个选项,在你跳跃之前看一看,或者容易请求宽恕而不是许可......这是在你跳跃之前看的,也许是正确的做法imho – 2014-12-10 23:09:59

在python中进行类型检查实际上非常简单,而且可能非常有用(至少我是这么认为的)。

type(variable) 
+2

对于继承的对象,'isinstance'测试将返回True 'dict'(可能是你想要的),而'type(var)== dict'不是 - 差别很重要。 – 2014-12-10 23:12:52

+0

这是真的,非常值得注意。根据我的理解,isinstance()用于类型检查,type()用于返回数据类型? – Jordan 2014-12-10 23:15:18

+0

如果在极少数情况下,您确实希望为'Foo'实例返回'True',而从'Foo'继承的类实例为'False',则'type(var)== Foo'可以。 – 2014-12-10 23:24:59

那么,有没有怒视问题,但如果你坚持:

  • 他们通常会说,这是更好地请求宽恕,然后权限。也许只是试图通过[]访问它,捕捉可能的例外是更多Pythonic,但我个人不这么认为。
  • 但我希望以使用抽象基类:

    import collections 
    isinstance(obj, collections.Mapping) 
    

    用这种方式,该功能可以支持其他可能的映射类型,而不是仅仅dict