<p><code>collections.abc.Iterable</code>选项的一个弱点是它不能处理像这样的自定义iterable类。。。在</p>
<pre><code>from collections.abc import Iterable
class MyIterable(object):
def __getitem__(self, index):
if index >= 10:
raise IndexError
return index
>>> myiter = MyIterable()
>>> isinstance(myiter, Iterable)
False
>>> [i for i in myiter]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
</code></pre>
<p>经常有人说,Pythonic的方法是使用<a href="http://en.wikipedia.org/wiki/Duck_typing" rel="nofollow">duck typing</a>,即尝试将对象视为iterable,并在异常失败时处理异常。例如。。。在</p>
^{pr2}$
<p>…但是,这两种方法都有一个弱点,即将字符串视为与列表相同的东西,这通常不是您想要的。通常您希望测试iterable<strong>容器</strong>,这是略有不同的,因此通常会看到代码将字符串视为这种特殊情况。。。在</p>
<pre><code>class MjmMenuControl(MjmBaseMenu):
def __init__(self, items=None):
if isinstance(items, (str, bytes)):
do_something_else()
else:
try:
for item in items:
do_something_with(item)
except TypeError:
# If we get here, 'items' is not iterable
do_something_else()
</code></pre>
<p>…虽然有点乱,但能完成任务。在</p>