gpt4 book ai didi

python - 如何区分序列和映射

转载 作者:太空狗 更新时间:2023-10-29 22:17:08 26 4
gpt4 key购买 nike

我想对一个参数执行操作,因为它可能是一个类映射对象或一个类序列对象。我知道没有任何策略可以 100% 可靠地进行类类型检查,但我正在寻找一个可靠的解决方案。

基于此answer ,我知道如何确定某物是否是一个序列,我可以在检查对象是否是 map 后进行此检查。

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

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

更新

我选择了 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 集合 ABC(请参阅@Manoj 评论)。我认为 keys 属性(删除他/她的答案的人提到的)足以检查映射。

扩展序列和映射 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 - 如何区分序列和映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3854470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com