有没有类似的方法isiterable?到目前为止,我发现的唯一解决方案是致电
isiterable
hasattr(myObj, '__iter__')
但我不确定这是多么万无一失。
检查__iter__序列类型的工作,但它会失败,例如 Python 2 中的字符串。我也想知道正确的答案,在那之前,这是一种可能性(也适用于字符串):
__iter__
from __future__ import print_function
try: some_object_iterator = iter(some_object) except TypeError as te: print(some_object, ‘is not iterable’)
iter内置检查__iter__方法或在字符串的情况下检查__getitem__方法。
iter
__getitem__
Pythonic 编程风格,通过检查对象的方法或属性签名而不是通过与某个类型对象的显式关系来确定对象的类型(“如果它看起来像 鸭子 ,叫起来像 鸭子 ,它一定是 鸭子 。”)通过强调接口精心设计的代码不是特定类型,而是通过允许多态替换来提高其灵活性。Duck-typing 避免了使用 type() 或 isinstance() 的测试。 相反,它通常采用 EAFP(比许可更容易请求宽恕)编程风格。 … > try: _ = (e for e in my_object) except TypeError: print my_object, 'is not iterable'
Pythonic 编程风格,通过检查对象的方法或属性签名而不是通过与某个类型对象的显式关系来确定对象的类型(“如果它看起来像 鸭子 ,叫起来像 鸭子 ,它一定是 鸭子 。”)通过强调接口精心设计的代码不是特定类型,而是通过允许多态替换来提高其灵活性。Duck-typing 避免了使用 type() 或 isinstance() 的测试。 相反,它通常采用 EAFP(比许可更容易请求宽恕)编程风格。
…
> try: _ = (e for e in my_object) except TypeError: print my_object, 'is not iterable'
该collections模块提供了一些抽象基类,允许询问类或实例是否提供特定功能,例如:
collections
from collections.abc import Iterable
if isinstance(e, Iterable): # e is iterable
但是,这不会检查可通过 迭代的类__getitem__。