Alex Martelli의 뛰어난 해킹을 명시 적으로 확장하고 이에 대한 collections.py몇 가지 질문을 해결합니다. 현재 Python 3.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]