假设您在Python数据结构中内置了一个读入Python的任意JSON对象。假设您希望以递归方式遍历此结构并对所有原始值执行某些操作,并对集合进行更深入的处理。
def recursiveMap(something, func):
if isinstance(something, Collection):
for item in something:
return recursiveMap(item, func)
else:
return func(something)
所以我的问题是:是否有一个类型集合可以匹配列表和字典而不是字符串?
从https://docs.python.org/3.6/library/collections.abc.html#collections-abstract-base-classes采购我的类型我尚未找到一个:
>>> isinstance("", c.Container)
True
>>> isinstance("", c.Hashable)
True
>>> isinstance("", c.Iterable)
True
>>> isinstance("", c.Sized)
True
>>> isinstance("", c.Callable)
False
>>> isinstance({}, c.Callable)
False
>>> isinstance("", c.Sequence)
True
这不是关于Python认为字符串是否是上面列出的任何类型是正确的问题,而是关于是否存在满足示例算法需求的其他类型的实际问题。第一个代码清单。
答案 0 :(得分:5)
处理此问题的每种方法只是将您想要匹配的所有类型组合在一起。 isinstance
将采用类型和单一类型的元组:
>>> CollectionTypes = list, dict, set
>>> isinstance("", CollectionTypes)
False
>>> isinstance({}, CollectionTypes)
True
>>>
如果您确实找到了与这三种类型完全匹配且与str
不匹配的预定义类型,那么您已经锁定了自己,并且在以后确定您还需要{{1}或者匹配中包含的其他一些类型,你将回到正方形。这就是为什么在这里明确你要匹配的类型的原因。
答案 1 :(得分:2)
由于您正在处理hashable(string)vs non-hashable(list,dict,set)对象,因此可以使用collections.Hashable
:
>>> import collections
>>> isinstance([], collections.Hashable)
False
>>> isinstance({}, collections.Hashable)
False
>>> isinstance(set(), collections.Hashable)
False
>>> isinstance('', collections.Hashable)
True
当然要添加not
来反转布尔值。
替代方案只是提供多个参数:
>>> isinstance('', (set, dict, list))
False
>>> isinstance([], (set, dict, list))
True