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" } })
在python中进行类型检查实际上非常简单,而且可能非常有用(至少我是这么认为的)。
type(variable)
对于继承的对象,'isinstance'测试将返回True 'dict'(可能是你想要的),而'type(var)== dict'不是 - 差别很重要。 – 2014-12-10 23:12:52
这是真的,非常值得注意。根据我的理解,isinstance()用于类型检查,type()用于返回数据类型? – Jordan 2014-12-10 23:15:18
如果在极少数情况下,您确实希望为'Foo'实例返回'True',而从'Foo'继承的类实例为'False',则'type(var)== Foo'可以。 – 2014-12-10 23:24:59
那么,有没有怒视问题,但如果你坚持:
- 他们通常会说,这是更好地请求宽恕,然后权限。也许只是试图通过
[]
访问它,捕捉可能的例外是更多Pythonic,但我个人不这么认为。 -
但我希望以使用抽象基类:
import collections isinstance(obj, collections.Mapping)
用这种方式,该功能可以支持其他可能的映射类型,而不是仅仅
dict
。
你为什么不认为这是正确的方法?你必须选择一个选项,在你跳跃之前看一看,或者容易请求宽恕而不是许可......这是在你跳跃之前看的,也许是正确的做法imho – 2014-12-10 23:09:59