AlexMartelliの優れたハックを明示的に拡張する collections.py、その周りのいくつかの質問に対処するには:python3.6 +で現在機能しているソリューションは次のとおりです。
import collections
import _collections_abc as cabc
import abc
class NonStringIterable(metaclass=abc.ABCMeta):
__slots__ = ()
@abc.abstractmethod
def __iter__(self):
while False:
yield None
@classmethod
def __subclasshook__(cls, c):
if cls is NonStringIterable:
if issubclass(c, str):
return False
return cabc._check_methods(c, "__iter__")
return NotImplemented
と実証
>>> typs = ['string', iter(''), list(), dict(), tuple(), set()]
>>> [isinstance(o, NonStringIterable) for o in typs]
[False, True, True, True, True, True]
追加したい場合 iter('')たとえば、除外する場合は、行を変更します
if issubclass(c, str):
return False
することが
if issubclass(c, (str, cabc.str_iterator)):
return False
取得するため
[False, False, True, True, True, True]