是否有匹配列表,dicts和集但不匹配字符串的Python类型签名?

时间:2018-06-12 08:40:17

标签: python python-3.x

假设您在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认为字符串是否是上面列出的任何类型是正确的问题,而是关于是否存在满足示例算法需求的其他类型的实际问题。第一个代码清单。

2 个答案:

答案 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