加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 如何区分序列和映射

发布时间:2020-12-16 23:04:37 所属栏目:Python 来源:网络整理
导读:我想基于它可能是类似地图的对象或类似序列的对象的事实对参数执行操作.我知道没有策略可以100%可靠地进行类型检查,但我正在寻找一个强大的解决方案. 基于这个answer,我知道如何确定是否有某个序列,我可以在检查对象是否是地图后进行检查. def ismap(arg):
我想基于它可能是类似地图的对象或类似序列的对象的事实对参数执行操作.我知道没有策略可以100%可靠地进行类型检查,但我正在寻找一个强大的解决方案.

基于这个answer,我知道如何确定是否有某个序列,我可以在检查对象是否是地图后进行检查.

def ismap(arg):
   # How to implement this?

def isseq(arg):
   return hasattr(arg,"__iter__")

def operation(arg):
   if ismap(arg):
      # Do something with a dict-like object
   elif isseq(arg):
      # Do something with a sequence-like object
   else:
      # Do something else

因为序列可以看作键是整数的映射,我应该尝试找到一个不是整数的键吗?或者我可以查看字符串表示?要么…?

UPDATE

我选择了SilentGhost的答案,因为它看起来是最“正确”的答案,但根据我的需要,这是我最终实现的解决方案:

if hasattr(arg,'keys') and hasattr(arg,'__getitem__'):
   # Do something with a map
elif hasattr(arg,'__iter__'):
   # Do something with a sequence/iterable
else:
   # Do something else

本质上,我不想依赖ABC,因为有许多自定义类的行为类似于序列和字典,但仍然没有扩展python集合ABCs(参见@Manoj评论).我认为键属性(由删除他/她的答案的人提到)对映射是一个很好的检查.

扩展序列和映射ABC的类也将与此解决方案一起使用.

解决方法

>>> from collections import Mapping,Sequence
>>> isinstance('ac',Sequence)
True
>>> isinstance('ac',Mapping)
False
>>> isinstance({3:42},Mapping)
True
>>> isinstance({3:42},Sequence)
False

collections abstract base classes (ABCs)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读