[python] 객체는 열거 가능하지만 색인을 생성 할 수 없습니까?

문제 요약 및 질문

열거 할 수는 있지만 색인을 생성 할 수없는 객체 내부의 일부 데이터를 보려고합니다. 나는 여전히 파이썬에 익숙하지 않지만 이것이 어떻게 가능한지 이해하지 못합니다.

열거 할 수 있다면 열거와 같은 방식으로 인덱스에 액세스 할 수없는 이유는 무엇입니까? 그렇지 않은 경우 항목에 개별적으로 액세스 할 수있는 방법이 있습니까?

실제 예

import tensorflow_datasets as tfds

train_validation_split = tfds.Split.TRAIN.subsplit([6, 4])

(train_data, validation_data), test_data = tfds.load(
    name="imdb_reviews",
    split=(train_validation_split, tfds.Split.TEST),
    as_supervised=True)

데이터 세트의 일부를 선택

foo = train_data.take(5)

내가 할 수 반복 foo열거와 함께 :

[In] for i, x in enumerate(foo):
    print(i)

예상 출력을 생성합니다.

0
1
2
3
4

그러나 색인을 생성하려고 foo[0]하면이 오류가 발생합니다.

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-44-2acbea6d9862> in <module>
----> 1 foo[0]

TypeError: 'TakeDataset' object does not support indexing



답변

파이썬은 클래스에 메소드가있는 경우에만 다음을 허용합니다.

모든 클래스는 다른 클래스를 정의하지 않고 하나를 정의 할 수 있습니다. __getattr__비효율적 인 경우 일반적으로 정의되지 않습니다.


에서 __next__ 반환 한 클래스에는 1 이 필요합니다 __iter__.


답변

이는 foo반복 가능하지만 __getitem__기능이 없는 결과입니다 . itertools.issliceiterable의 n 번째 요소를 얻는 데 사용할 수 있습니다.

import itertools

def nth(iterable, n, default=None):
    "Returns the nth item or a default value"
    return next(itertools.islice(iterable, n, None), default)


답변

파이썬에서, 커스텀 클래스의 인스턴스는 특별한 (또는 “dunder”) __iter__메소드를 통해 열거를 구현할 수 있습니다 . 아마도이 클래스는 구현 __iter__하지만 구현 하지는 않습니다 __getitem__.

던더 개요 : https://dbader.org/blog/python-dunder-methods 메서드
사양 __iter__: https://docs.python.org/3/library/stdtypes.html#typeiter


답변