为了账号安全,请及时绑定邮箱和手机立即绑定

在Python中,如何确定对象是否是可迭代的?

在Python中,如何确定对象是否是可迭代的?

有只小跳蛙 2019-06-20 10:43:03
在Python中,如何确定对象是否是可迭代的?有没有类似的方法isiterable?到目前为止我找到的唯一解决办法就是打电话hasattr(myObj, '__iter__')但我不知道这有多蠢。
查看完整描述

3 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

  1. 检查__iter__在序列类型上工作,但在例如字符串上会失败在Python 2中..我也想知道正确的答案,在此之前,有一种可能性(也适用于字符串):

    try:
        some_object_iterator = iter(some_object)except TypeError as te:
        print some_object, 'is not iterable'

    这个iter内建检查__iter__方法,或者在字符串的情况下,__getitem__方法。

  2. 另一种一般的pythonic方法是假设一个可迭代的,如果它不能在给定的对象上工作,那么它就会优雅地失败。Python词汇表:

    Pythonic编程风格,它通过检查对象的方法或属性签名来确定对象的类型,而不是通过与某个类型对象的显式关系(“如果它看起来像鸭子嘎嘎作响就像鸭子,一定是鸭子)通过强调接口而不是特定类型,精心设计的代码通过允许多态替换来提高其灵活性。鸭子类型避免使用type()或isinstent()进行测试。相反,它通常采用EAFP(请求宽恕比许可容易)的编程风格。

    ...

    try:
       _ = (e for e in my_object)except TypeError:
       print my_object, 'is not iterable'
  3. 这个collections模块提供了一些抽象基类,允许询问类或实例是否提供特定功能,例如:

    from collections.abc import Iterableif isinstance(e, Iterable):
        # e is iterable

    但是,这不检查可迭代的类。__getitem__.


查看完整回答
反对 回复 2019-06-20
?
RISEBY

TA贡献1856条经验 获得超5个赞

鸭型

try:
    iterator = iter(theElement)except TypeError:
    # not iterableelse:
    # iterable# for obj in iterator:#     pass

类型检查

使用抽象基类..它们至少需要Python2.6,并且只适用于新样式的类。

from collections.abc import Iterable   # import directly from collections for Python < 3.3if isinstance(theElement, Iterable):
    # iterableelse:
    # not iterable

然而,iter()是否更可靠,如所述通过文件:

检查isinstance(obj, Iterable)检测注册为Iterable或具有__iter__()方法,但它不会检测到使用__getitem__()方法。确定对象是否可迭代的唯一可靠方法是调用iter(obj).


查看完整回答
反对 回复 2019-06-20
  • 3 回答
  • 0 关注
  • 745 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信