python – 如何区分序列和映射

python – 如何区分序列和映射,第1张

概述我想基于它可能是类似地图的对象或类似序列的对象的事实对参数执行 *** 作.我知道没有策略可以100%可靠地进行类型检查,但我正在寻找一个强大的解决方案. 基于这个answer,我知道如何确定是否有某个序列,我可以在检查对象是否是地图后进行检查. def ismap(arg): # How to implement this?def isseq(arg): return hasattr(a 我想基于它可能是类似地图的对象或类似序列的对象的事实对参数执行 *** 作.我知道没有策略可以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 mapelif hasattr(arg,'__iter__'):   # Do something with a sequence/iterableelse:   # 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)

总结

以上是内存溢出为你收集整理的python – 如何区分序列和映射全部内容,希望文章能够帮你解决python – 如何区分序列和映射所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1206679.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存