Можно ли получить индекс следующего элемента от итератора? - PullRequest
1 голос
/ 11 апреля 2019

Рассмотрим следующую программу, название которой должно быть само за себя. Мне нужно реализовать функцию next_index(it), которая возвращает индекс следующего элемента, который собирается вернуть итератор.

def next_index(it):
    #do something here
    #return the index of next element the iterator will fetch
    return -1 #dummy value being returned now

l = [0,1,2,3,4]
it = iter(l)
fst = it.__next__()
print(fst) # prints 0, the next call to it.__next__() will return the element at index 1

n_i = next_index(it)
#n_i should be 1
print(n_i)

_ = it.__next__()

n_i = next_index(it)
#n_i should be 2 now
print(n_i)

Я знаю, что итераторы обычно используются, когда вам не нужен индекс, а для индекса мы можем использовать enumerate. Однако я пытаюсь провести некоторый динамический анализ с трассировкой уровня bytecode . Циклы, подобные следующим, повторяются с использованием iterators . Мне нужно отслеживать индекс, к которому обращается итератор. Хотя должны быть обходные пути, например, точное отслеживание индекса в анализе prgroam, такая функция, как next_index(it), сделает это простым и менее подверженным ошибкам.

l = [0,1,2,3,4]
for c in l:
    print(c)

1 Ответ

0 голосов
/ 11 апреля 2019

Оберните итератор чем-то, что ведет счет того, что было получено.

class EnumeratedIter:
    def __init__(self, it):
        self.it = it
        self.index = 0

    def __next__(self):
        self.index += 1
        return next(self.it)

    def __iter__(self):
        return self


def next_index(it):
    return it.index

l = list("abcde")
it = EnumeratedIter(iter(l))

n_i = next_index(it)
assert n_i == 0

next(it)
n_i = next_index(it)
assert n_i == 1

next(it)
n_i = next_index(it)
assert n_i == 2
...