programing

Python에서는 오브젝트가 반복 가능한지 어떻게 판단합니까?

sourcejob 2023. 1. 17. 21:18
반응형

Python에서는 오브젝트가 반복 가능한지 어떻게 판단합니까?

요?isiterable 유일한

hasattr(myObj, '__iter__')

하지만 나는 이것이 얼마나 바보같은지 잘 모르겠다.

  1. for__iter__시퀀스 유형에서는 동작하지만 Python 2의 문자열에서는 실패합니다.저도 정답을 알고 싶습니다만, 그때까지 (현에서도) 한 가지 가능성이 있습니다.

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

iter, " " "의__iter__, 「」는 「」입니다.__getitem__★★★★★★ 。

  1. 또 다른 일반적인 비단뱀식 접근법은 반복 가능한 것으로 가정하고 주어진 물체에 효과가 없다면 우아하게 실패하는 것이다.Python 용어집:

어떤 타입 오브젝트와의 명시적인 관계보다는 메서드 또는 속성 시그니처를 검사하여 오브젝트의 타입을 결정하는 피토닉 프로그래밍 스타일("오리처럼 보이고 오리처럼 울부짖는다면 오리여야 한다") 특정 타입이 아닌 인터페이스를 강조함으로써 잘 설계된 코드는 p를 허용함으로써 오브젝트의 유연성을 향상시킵니다.올모픽 치환duck-type은 type() 또는 isinstance()를 사용한 테스트를 회피합니다.대신 일반적으로 EAFP(허가보다 용서를 구하는 것이 용이함) 스타일의 프로그래밍을 사용합니다.

...

try:
   _ = (e for e in my_object)
except TypeError:
   print my_object, 'is not iterable'
  1. 모듈에서는 다음과 같은 특정 기능을 제공하는지 여부를 클래스 또는 인스턴스에 문의할 수 있는 추상 기본 클래스를 제공합니다.

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

은 ,, 것, 것, 것을 통해 반복 하지 않습니다.__getitem__.

덕 타이핑

try:
    iterator = iter(the_element)
except TypeError:
    # not iterable
else:
    # iterable

# for obj in iterator:
#     pass

유형 확인

Abstract 기본 클래스를 사용합니다.적어도 Python 2.6이 필요하며 새로운 스타일의 수업에서만 작동합니다.

from collections.abc import Iterable   # import directly from collections for Python < 3.3

if isinstance(the_element, Iterable):
    # iterable
else:
    # not iterable

★★★★★★★★★★★★★★.iter()는 매뉴얼에 기재되어 있는 바와 같이 신뢰성이 다소 향상되었습니다.

isinstance(obj, Iterable) Itable이 있는 합니다.__iter__(). ,, class 를 를 를 반 를 를 、 를 를 를 를 、__getitem__() 신뢰할 수 있는 호출하는 것입니다.iter(obj).

iter,__iter__ ★★★★★★★★★★★★★★★★★」__getitem__★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★을 가지고 , 할 수 은 왜, 이 할 수 있는 최선이 를 알 수이다.

try:
    iter(maybe_iterable)
    print('iteration will probably work')
except TypeError:
    print('not iterable')

, 했을 때 어떤 이 일어나는지 알려드리겠습니다.forpython으로 루프한 후 사실을 설명하기 위한 토론이 이어집니다.

사실들

  1. 수 .oiter(o) 중 :

    a)o 있다__iter__이치노란 '반복하다'가 물체를 .__iter__ a. a. a.__next__(Python 2:next 식입니니다다

    b)o 가지고 있다__getitem__★★★★★★ 。

  2. " " " " " "Iterable ★★★★★★★★★★★★★★★★★」Sequence "Attribute"를 __iter__충분하지 않습니다.

  3. 「」의 .o에서는, 「」만 실장됩니다.__getitem__ 않다.__iter__,iter(o)에서는, 에서의 아이템을 합니다.o인덱스 0부터 시작하는 정수 인덱스로 지정합니다. 반복기는 임의의 "Imiterator"를 합니다.IndexError오류는 ) StopIteration그 자체입니다.

  4. iter시험해보는 것 말고는 제정신이야

  5. 「」의 .o를 실장하다__iter__ , . . . . . . . .iter가 반환된 을 확인합니다.__iter__ 하다. 이 건전성 검사만 하는 경우.__getitem__.

  6. __iter__이깁니다. 만약 오브젝트가o__iter__ ★★★★★★★★★★★★★★★★★」__getitem__,iter(o)를 호출합니다.__iter__.

  7. 의 오브젝트를 가능하게 경우는, 「반드시」를 .__iter__★★★★★★ 。

for 스루프

하기 는 '어느 정도', '어느 정도', '어느 정도'를 했을 때 에 대한 합니다.for파이썬이미 알고 있다면 다음 섹션으로 바로 건너뛸 수 있습니다.

「 」를 사용하는 for item in o한 오브젝트 「」에 대해서는, 「 」o calls , Python 호호iter(o)반환값으로서 반복기 오브젝트를 상정하고 있습니다.는 '반복하다'를 하는 모든 입니다.__next__ (오류)next2) 및 Python 2) __iter__★★★★★★ 。

「 」는__iter__ 객체 자체를 반환해야 합니다).return self은 Python을 호출합니다.next까지 반복하여StopIteration인스톨 됩니다. 것은 암묵적으로 , 알 수 .

import random

class DemoIterable(object):
    def __iter__(self):
        print('__iter__ called')
        return DemoIterator()

class DemoIterator(object):
    def __iter__(self):
        return self

    def __next__(self):
        print('__next__ called')
        r = random.randint(1, 10)
        if r == 5:
            print('raising StopIteration')
            raise StopIteration
        return r

「 」에 DemoIterable:

>>> di = DemoIterable()
>>> for x in di:
...     print(x)
...
__iter__ called
__next__ called
9
__next__ called
8
__next__ called
10
__next__ called
3
__next__ called
10
__next__ called
raising StopIteration

토론 및 일러스트

포인트 1과 2: 반복기 및 신뢰할 수 없는 체크 취득

다음 클래스를 고려합니다.

class BasicIterable(object):
    def __getitem__(self, item):
        if item == 3:
            raise IndexError
        return item

" "iter「 」의 BasicIterable.BasicIterable를 실장하다__getitem__.

>>> b = BasicIterable()
>>> iter(b)
<iterator object at 0x7f1ab216e320>

,과 같습니다.b does 。__iter__ 및 .Iterable ★★★★★★★★★★★★★★★★★」Sequence:

>>> from collections import Iterable, Sequence
>>> hasattr(b, '__iter__')
False
>>> isinstance(b, Iterable)
False
>>> isinstance(b, Sequence)
False

이것이 루치아노 라말호의 Fluent Python이 전화하는 것을 추천하는 이유입니다.iter 잠재적인 처리 TypeError오브젝트가 반복 가능한지 여부를 확인하는 가장 정확한 방법입니다.다음 중 하나:

Python 3.4의 를 입니다.x는 할 수 있는 요?iter(x) a TypeError예외로 합니다.보다 정확해요.isinstance(x, abc.Iterable), 냐냐iter(x)__getitem__, method는 '')입니다.IterableABC의

포인트 3: 다음 기능만을 제공하는 오브젝트에 대해 반복한다.__getitem__ 않다.__iter__

BasicIterable정상적으로 동작합니다.Python은 하여 Python이 0까지 인덱스로 합니다. 0으로, 0으로, >로,IndexError인스톨 됩니다. 오브젝트의 ★★★★★★★★★★★★★★★★★★★★★★★★★」__getitem__ 메서드를 합니다.item그것은 의 논거로서 제공되었다.__getitem__(self, item)에 의해 iter.

>>> b = BasicIterable()
>>> it = iter(b)
>>> next(it)
0
>>> next(it)
1
>>> next(it)
2
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

는 「」를 .StopIteration할 수 없는 및 할 수 없는 IndexError을 위해 사육되고 있다.item == 3을 사용하다에 " "를 통한 BasicIterable a for이치노

>>> for x in b:
...     print(x)
...
0
1
2

또 . 가 어떻게 에 대한 입니다.이러한 예에서는, 이 조작을 반복하는 사람이, 이 조작에 의해서 어떻게 반환되는지에 대한 개념을 이해할 수 있습니다.iter인덱스로 항목에 액세스하려고 합니다. WrappedDict되지 않습니다.dict에는 ', ', ','가 없습니다__iter__★★★★★★ 。

class WrappedDict(object): # note: no inheritance from dict!
    def __init__(self, dic):
        self._dict = dic

    def __getitem__(self, item):
        try:
            return self._dict[item] # delegate to dict.__getitem__
        except KeyError:
            raise IndexError

「」에의해 주세요.__getitem__dict.__getitem__이치노

>>> w = WrappedDict({-1: 'not printed',
...                   0: 'hi', 1: 'StackOverflow', 2: '!',
...                   4: 'not printed', 
...                   'x': 'not printed'})
>>> for x in w:
...     print(x)
... 
hi
StackOverflow
!

포인트 4와 5:가 호출할 때 반복기를 확인합니다.

iter(o) 「」에 됩니다.o,iter의 수익률을 보증합니다.__iter__메서드가 있는 경우,는 반복기입니다., 는 반드시 ,, 환, 환, 환, 반을 구현해야 .__next__ (오류)next) 및 Python 2)의 »__iter__iter 、 「 「 」 、 「 」를 제공하는 는, 체크를 할 수 없습니다.__getitem__오브젝트 항목에 정수 인덱스로 액세스할 수 있는지 여부를 확인할 수 없기 때문입니다.

class FailIterIterable(object):
    def __iter__(self):
        return object() # not an iterator

class FailGetitemIterable(object):
    def __getitem__(self, item):
        raise Exception

에서 를 구성하는 해 주세요.FailIterIterable를 작성하면 합니다.이때부터의 반복기(instance(instance에 실패합니다.FailGetItemIterable하지만 첫 됩니다.__next__.

>>> fii = FailIterIterable()
>>> iter(fii)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: iter() returned non-iterator of type 'object'
>>>
>>> fgi = FailGetitemIterable()
>>> it = iter(fgi)
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/path/iterdemo.py", line 42, in __getitem__
    raise Exception
Exception

6: 포 6 66:__iter__

구현되어 있는 경우__iter__ ★★★★★★★★★★★★★★★★★」__getitem__,iter를 호출합니다.__iter__ 합니다. 하다

class IterWinsDemo(object):
    def __iter__(self):
        return iter(['__iter__', 'wins'])

    def __getitem__(self, item):
        return ['__getitem__', 'wins'][item]

및 인스턴스 루프 시 출력:

>>> iwd = IterWinsDemo()
>>> for x in iwd:
...     print(x)
...
__iter__
wins

7:해야 합니다.__iter__

시퀀스가 " " "와 같은지 해 볼 수 .list __iter__의 경우의 메서드__getitem__충분할 겁니다.

class WrappedList(object): # note: no inheritance from list!
    def __init__(self, lst):
        self._list = lst

    def __getitem__(self, item):
        return self._list[item]

위의 에서 반복됩니다.에 의해, 「」에 콜이 됩니다.__getitem__로로 합니다.list.__getitem__표기 는

>>> wl = WrappedList(['A', 'B', 'C'])
>>> for x in wl:
...     print(x)
... 
A
B
C

이 실장해야 __iter__음음음같 뭇매하다

  1. 「 」를 실장했을 __iter__ 가능한 것으로 , 「반복할 수 있습니다.isinstance(o, collections.abc.Iterable)True.
  2. __iter__가 아닙니다.iter즉석에서 실패하여 문제가 발생할 수 있습니다.TypeError.
  3. ★★★★★★★★의 특별 취급__getitem__는 하위 호환성을 위해 존재합니다.Fluent Python 서시 시시 :

에 Python 반복할 수 .Python 시퀀스는 Python을 구현하고 있습니다.__getitem__되어 있습니다__iter__ ,리,,,,,,,,,,,, of , , 、 , 、 , 、 , 、 , 、 , 、 , 、 , 、 , 、 , 、 , , , , 。__getitem__는 하위 호환성을 위해 존재하며 향후 사라질 수 있습니다(단, 이 글을 쓰면서 권장되는 것은 아닙니다).

나는 최근에 이 문제에 대해 꽤 많이 공부하고 있다.이 결론에 근거해 보면, 현재는 이것이 최선의 어프로치입니다.

from collections.abc import Iterable   # drop `.abc` with Python 2.7 or lower

def iterable(obj):
    return isinstance(obj, Iterable)

된 바 , 으로는 '할 수 없다'를 인 의견입니다.iter()더 좋을 것 같습니다.

def iterable(obj):
    try:
        iter(obj)
    except Exception:
        return False
    else:
        return True

사용한 적이 있습니다.iter()이 목적을 위해 우리의 코드에도 포함되지만, 나는 최근에 오직 이 목적만을 가진 사물들에 점점 더 짜증이 나기 시작했다.__getitem__을 사용하다 만한 .__getitem__반복할 수 없는 오브젝트에서는 위의 코드가 제대로 작동하지 않습니다.실생활의 예로는 페이커를 사용할 수 있습니다.위의 코드는 반복가능하다고 보고하고 있지만 실제로 반복하려고 하면,AttributeError.0 (Faker 4.0.2에서 테스트):

>>> from faker import Faker
>>> fake = Faker()
>>> iter(fake)    # No exception, must be iterable
<iterator object at 0x7f1c71db58d0>
>>> list(fake)    # Ooops
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/.../site-packages/faker/proxy.py", line 59, in __getitem__
    return self._factory_map[locale.replace('-', '_')]
AttributeError: 'int' object has no attribute 'replace'

을 쓰면insinstance() 페이커만 를는 않습니다.__getitem__복복: :

>>> from collections.abc import Iterable
>>> from faker import Faker
>>> isinstance(Faker(), Iterable)
False

에서는 '아까보다 더 좋다'를 사용한다고 했어요.iter()은 Python을 더합니다.__getitem__isinstance()은 오래된될 수 , 저의 철저한 테스트 Python의 경우, Python의 경우, Python의 경우, Python의 경우, Python의 경우, Python의 경우, Python의 경우, Python의 경우, Python의 경우, Python의 경우, Python의 경우, Python의 경우, Python의 경우, Python의 경우, Python의 경우, Python의 경우, Python의 경우, Python의 경우, Pythonisinstance()★★★★★★★★★★★★★★★★★★★★★★★★★★" " " " ''가isinstance()하지 않았지만, ★★★★★★★★★★★★★★★★★★★★★★」iter()UserDictPython 2는 Python 2입니다.관련성이 있는 경우는, 다음과 같이 사용할 수 있습니다.isinstance(item, (Iterable, UserDict))그 일을 해결하려고요.

Python 3.5에서는 표준 라이브러리의 타이핑 모듈을 사용하여 다음과 같은 유형을 지정할 수 있습니다.

from typing import Iterable

...

if isinstance(my_item, Iterable):
    print(True)

합니다. 입니다. 반환된 개체는 다음과 같습니다.__iter__는 반복 프로토콜을 구현해야 합니다(즉,next메서드).메뉴얼의 관련 항을 참조해 주세요.

Python 에서는, 「체크」대신 「해 보고 싶다」라고 하는 것이 좋은 프랙티스입니다.

Python <= 2.5에서는 할 수도 없고 할 수도 없습니다. 반복할 수도 있는 것은 "반복 가능한" 인터페이스였습니다.

그러나 Python 2.6 및 3.0에서는 새로운 ABC(추상 기본 클래스) 인프라스트럭처를 컬렉션 모듈에서 사용할 수 있는 일부 내장 ABC와 함께 활용할 수 있습니다.

from collections import Iterable

class MyObject(object):
    pass

mo = MyObject()
print isinstance(mo, Iterable)
Iterable.register(MyObject)
print isinstance(mo, Iterable)

print isinstance("abc", Iterable)

이것이 바람직한지 실제 효과가 있는지는 단지 관례의 문제일 뿐입니다.보시다시피 반복할 수 없는 개체를 Itable로 등록할 수 있습니다. 그러면 실행 시 예외가 발생합니다.따라서 isinstance는 Python에서 사용할 수 있는 "declared" 타입의 호환성을 확인하는 새로운 의미를 획득합니다.

한편 오브젝트가 필요한 인터페이스를 충족하지 못할 경우 어떻게 해야 합니까?다음 예를 들어 보겠습니다.

from collections import Iterable
from traceback import print_exc

def check_and_raise(x):
    if not isinstance(x, Iterable):
        raise TypeError, "%s is not iterable" % x
    else:
        for i in x:
            print i

def just_iter(x):
    for i in x:
        print i


class NotIterable(object):
    pass

if __name__ == "__main__":
    try:
        check_and_raise(5)
    except:
        print_exc()
        print

    try:
        just_iter(5)
    except:
        print_exc()
        print

    try:
        Iterable.register(NotIterable)
        ni = NotIterable()
        check_and_raise(ni)
    except:
        print_exc()
        print

오브젝트가 기대치를 충족하지 못할 경우 TypeError만 던지지만 적절한 ABC가 등록되어 있으면 수표는 무용지물입니다. 반 on the 의 경우, on on on on__iter__메서드를 사용할 수 있습니다.Python python python python python python pythonable ableable pythonable Itable python python python python python python 。

그러니 반복할 수 있는 것만 기대한다면, 반복하고 잊어버려라.한편, 입력 타입에 따라서 다른 작업을 실시할 필요가 있는 경우는, ABC 인프라스트럭처가 매우 편리할 가능성이 있습니다.

try:
  #treat object as iterable
except TypeError, e:
  #object is not actually iterable

오리가 정말 오리인지 아닌지 확인하기 위해 검사를 하지 말고, 오리가 참을 수 있는 것인지 아닌지를 확인하고, 오리가 그럴 수 있는 것처럼 대하고, 그렇지 않으면 불평하세요.

다음과 같이 시도해 볼 수 있습니다.

def iterable(a):
    try:
        (x for x in a)
        return True
    except TypeError:
        return False

만약 우리가 그것을 반복하는 발전기를 만들 수 있다면(하지만 발전기를 사용하지 않기 때문에 공간을 차지하지 않는다), 그것은 반복할 수 있다.'아차' 같은 거 같은데변수가 처음부터 반복 가능한지 확인해야 하는 이유는 무엇입니까?

지금까지 발견한 최고의 솔루션:

hasattr(obj, '__contains__')

으로 사물이 를 확인합니다.in환입니니다다

장점(다른 솔루션에는 3가지 모두 없음):

  • 그것은 표현이다(시도에 반하여 람다로서 기능한다...).배리언트 제외)
  • 스트링을 포함한 모든 반복 가능한 것(반대되는 것)에 의해 구현된다.__iter__)
  • 모든 Python에서 작동 >= 2.5

주의:

  • "허가가 아닌 용서를 구한다"는 Python의 철학은 예를 들어 목록에서 반복 가능과 비반복 가능을 모두 가지고 있고 각 요소를 유형에 따라 다르게 취급해야 할 때 잘 작동하지 않습니다(실효하는 것을 제외하고 반복 불가능을 취급하지만, 그것은 역겹고 오해의 소지가 있습니다).
  • 오브젝트(예를 들어 [obj의 x를 위한 x])를 실제로 반복하려고 하는 이 문제에 대한 해결책(예를 들어 반복 가능의 처음 몇 가지 요소만 필요한 경우)은 대규모 반복 가능에 대해 상당한 성능 불이익을 초래할 수 있으므로 피해야 합니다.

여기서 좋은 해결책을 찾았습니다.

isiterable = lambda obj: isinstance(obj, basestring) \
    or getattr(obj, '__iter__', False)

Python 2 Glossary에 따르면 반복가능성은

타입(「」등)을 참조해 주세요.list,str , , , , 입니다.tuple와 같은 입니다.dict ★★★★★★★★★★★★★★★★★」file "로 정의한 __iter__() ★★★★★★★★★★★★★★★★★」__getitem__()「」. 많은 map ...)에서할 수 있습니다.반복 가능은 for 루프 및 시퀀스가 필요한 다른 많은 장소(zip(), map(), ...)에서 사용할 수 있습니다.반복 가능한 객체가 삽입 함수 반복기()에 인수로 전달되면 객체의 반복기를 반환합니다.

물론 Python의 일반적인 코딩 스타일은 "허락보다 용서를 구하는 것이 더 쉽다"는 사실에 근거하고 있습니다.

try:
    for i in object_in_question:
        do_something
except TypeError:
    do_something_for_non_iterable

에는 ,, 시, 시, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, but, but, but, but, but, but, for, but, but, for, for, for, but, for, for, , for, for, forhasattr(object_in_question, "__iter__") or hasattr(object_in_question, "__getitem__")다 왜냐하면 이 둘 다 해야 돼요.str__iter__ Python 2, ) 및 "Python 2, Python 3이 있기 때문입니다.generator「」가 .__getitem__★★★★★★ 。

내하곤 한다.iterable(제안 포함): (Alfe의 간결화 제안).

import collections

def iterable(obj):
    return isinstance(obj, collections.Iterable):

그래서 당신은 어떤 물체가 매우 읽기 쉬운 형태로 반복될 수 있는지 테스트할 수 있다.

if iterable(obj):
    # act on iterable
else:
    # not iterable

the the the the the the the as as as as as as ascallable

가 설치되어 있는 「from: numpy 」 「numpy 」 「numpy 」 「numpy 」 「numpy 」 「numpy 」 「numpy 」 「numpy 」 「numpy 」 「numpy 」numpy import iterable 간단히 '아주 좋다'와 같은 것입니다.

def iterable(obj):
    try: iter(obj)
    except: return False
    return True

numpy가 없는 경우 이 코드 또는 위의 코드를 구현할 수 있습니다.

에게는 다음과 같은 기능이 내장되어 있습니다.

from pandas.util.testing import isiterable

비단뱀이 비단뱀을 가지고 있는지 할 수 callable(obj) -> bool 아니다iterable(obj) -> bool
하는 이 더 hasattr(obj,'__call__')더 느리더라도.

외 으로 사용할 수 있습니다.try/except TypeError'예외 '를 합니다.여기서 구현 예를 나타냅니다.iterable(obj) -> bool점점 더 좋아지고 자주 사용하게 되었습니다.

파이톤2를 위해서 람다를 사용해서 성능을 향상시키겠습니다.
에서는 함수를 할 때 을 사용하든.)def과 거의 같은 속도를 가지고 있다lambda)

iterable = lambda obj: hasattr(obj,'__iter__') or hasattr(obj,'__getitem__')

가 더 .__iter____getitem__.

의 반복 는 ""에 .__iter__서 특수한 는 fall fall where where where where where where where where where where where where where where where where로 된다.__getitem__단, 오브젝트를 반복하기 위해서는 둘 중 하나가 필요합니다.
이므로 C 을 줍니다 (C 오브젝트에도 영향을 줍니다.)

def is_iterable(x):
    try:
        0 in x
    except TypeError:
        return False
    else:
        return True

이것은 모든 종류의 반복 가능한 오브젝트에는 yes이지만 Python 2에서는 no라고 합니다.(예를 들어 재귀 함수가 문자열이나 문자열 컨테이너를 취할 수 있는 경우)이 경우 용서를 구하면 오부스코드가 발생할 수 있으므로 먼저 허락을 구하는 것이 좋습니다.)

import numpy

class Yes:
    def __iter__(self):
        yield 1;
        yield 2;
        yield 3;

class No:
    pass

class Nope:
    def __iter__(self):
        return 'nonsense'

assert is_iterable(Yes())
assert is_iterable(range(3))
assert is_iterable((1,2,3))   # tuple
assert is_iterable([1,2,3])   # list
assert is_iterable({1,2,3})   # set
assert is_iterable({1:'one', 2:'two', 3:'three'})   # dictionary
assert is_iterable(numpy.array([1,2,3]))
assert is_iterable(bytearray("not really a string", 'utf-8'))

assert not is_iterable(No())
assert not is_iterable(Nope())
assert not is_iterable("string")
assert not is_iterable(42)
assert not is_iterable(True)
assert not is_iterable(None)

여기 있는 다른 많은 전략들은 현악기에 동의 할 것이다.그게 네가 원하는 거라면 써.

import collections
import numpy

assert isinstance("string", collections.Iterable)
assert isinstance("string", collections.Sequence)
assert numpy.iterable("string")
assert iter("string")
assert hasattr("string", '__getitem__')

주의:은 유형 ": is_itable()" 합니다.bytes ★★★★★★★★★★★★★★★★★」bytearray.

  • bytes 가능한 Python 3입니다.True == is_iterable(b"string") == is_iterable("string".encode('utf-8'))Python 2 python python python 에 python python python python python python python 。
  • bytearray 가능한 Python 2의 3개의 입니다.True == is_iterable(bytearray(b"abc"))

.O.P.O.P.★hasattr(x, '__iter__')의 문자열에 , 2의 에 대해 합니다(「Python 3」의 「yes, Python 2」의 「no」에 ).'' ★★★★★★★★★★★★★★★★★」b'' ★★★★★★★★★★★★★★★★★」u''@@LuisMasueelli도 할 수 __iter__.

오브젝트가 반복 가능한지 여부를 확인하는 방법은 여러 가지가 있습니다.

from collections.abc import Iterable
myobject = 'Roster'
  
if isinstance(myobject , Iterable):
    print(f"{myobject } is iterable") 
else:
   print(f"strong text{myobject } is not iterable")

Python의 duck 타이핑에 관한 가장 쉬운 방법은 오류를 잡는 것입니다(Python은 오브젝트가 반복자가 되는 것을 정확히 알고 있습니다).

class A(object):
    def __getitem__(self, item):
        return something

class B(object):
    def __iter__(self):
        # Return a compliant iterator. Just an example
        return iter([])

class C(object):
    def __iter__(self):
        # Return crap
        return 1

class D(object): pass

def iterable(obj):
    try:
        iter(obj)
        return True
    except:
        return False

assert iterable(A())
assert iterable(B())
assert iterable(C())
assert not iterable(D())

주의:

  1. 가 반복할 수 없는 인지, 가 있는 것인지의 가 없다.__iter__예외 유형이 동일한 경우 구현되었습니다.을 사용법
  2. does하 does does how does does does does does does does does does?callable해서 '오리다'를 수 다.AttributeError__call__내 오브젝트에 대해 정의되어 있지 않지만 반복적인 체크는 그렇지 않습니까?

    유저준 코드로 그쓴 ).하여 다른 코드와 할 수 .I(및 다른 유저)가 준 함수를 실장할 수도 있고, 코드로 예외를 검출할 수도 있습니다(그 부분에서의 실장은 제가 작성한 기능과 같습니다).반복기 작성을 코드의 나머지 부분과 분리하여 예외를 캡처하여 다른 사용자와 구별할 수 있도록 하십시오.TypeError.

isiterable 코드에서의 는 func를 반환합니다.True할 수 없는 반환한다.False

def isiterable(object_):
    return hasattr(type(object_), "__iter__")

fruits = ("apple", "banana", "peach")
isiterable(fruits) # returns True

num = 345
isiterable(num) # returns False

isiterable(str) # returns False because str type is type class and it's not iterable.

hello = "hello dude !"
isiterable(hello) # returns True because as you know string objects are iterable

「 」를에, 「 」를 체크합니다.__iter__Attribute를할 수 .__len__스트링을 가능한

>>> hasattr(1, "__len__")
False
>>> hasattr(1.3, "__len__")
False
>>> hasattr("a", "__len__")
True
>>> hasattr([1,2,3], "__len__")
True
>>> hasattr({1,2}, "__len__")
True
>>> hasattr({"a":1}, "__len__")
True
>>> hasattr(("a", 1), "__len__")
True

반복할 수 없는 개체는 명백한 이유로 이를 구현하지 않습니다. 이 정의 표현은 되지 않습니다.이 표현식은, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」로 되어 있습니다.iter대처할 수 있습니다. 이것은 한 로 할 수a, 이, 이, 플, however, however, however, however, however, however, however, however, however, however, however, however, however, however, however, however, however, however, however, however, however, however, however, however, howeveror글씨를 주의하세요.type(my_generator_expression) == generator 던지다NameError대신 이 답변을 참조해 주세요.

제너레이터 사용 가능유형에서 유형:

>>> import types
>>> types.GeneratorType
<class 'generator'>
>>> gen = (i for i in range(10))
>>> isinstance(gen, types.GeneratorType)
True

--- utdemir의 답변을 받아들였습니다.

에 의해, 할 수 할 수 ).len, (즉, 「」, 「」)

"정답"은 아니지만, 현, 튜플, 플로트 등 가장 일반적인 유형의 빠른 확인에 도움이 됩니다.

>>> '__iter__' in dir('sds')
True
>>> '__iter__' in dir(56)
False
>>> '__iter__' in dir([5,6,9,8])
True
>>> '__iter__' in dir({'jh':'ff'})
True
>>> '__iter__' in dir({'jh'})
True
>>> '__iter__' in dir(56.9865)
False

파티에 좀 늦었지만 나는 스스로에게 이 질문을 했고 이것을 보고 답을 생각해냈다.누가 벌써 올렸는지 모르겠어요.그러나 기본적으로 모든 반복 가능한 유형의 dict에는 __getitem_()이 포함되어 있습니다.이렇게 해서 시도조차 하지 않고 어떤 물체가 반복 가능한지 확인할 수 있습니다. (Pun )

def is_attr(arg):
    return '__getitem__' in dir(arg)

코드에서는 반복할 수 없는 오브젝트를 체크하곤 했습니다.

hasattr(myobject,'__trunc__')

은 매우 할 수 할 수 있습니다).not를 참조해 주세요.

이 솔루션이 모든 객체에 적용되는지 100% 확신할 수는 없지만, 다른 객체에 대한 배경 정보를 제공할 수도 있습니다. __trunc__숫자 유형과 관련된 메서드 솔기(정수로 반올림할 수 있는 모든 객체 필요). 그 안에 있는 못 요.__trunc__ __iter__ ★★★★★★★★★★★★★★★★★」__getitem__.

언급URL : https://stackoverflow.com/questions/1952464/in-python-how-do-i-determine-if-an-object-is-iterable

반응형