В Python плохая практика «сбрасывать» итератор при вызове __iter__? - PullRequest
0 голосов
/ 04 октября 2018

Например, допустим, у меня есть класс для итерации записей внутри файла:

class MySpecialFile:
    ...
    def reset(self):
        self._handle.seek(0)

    def __iter__(self):
        self.reset()
        return self

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

iter, как ожидается, не будет иметь побочных эффектов.Нарушая это предположение, ваш код нарушает все виды вещей.Например, стандартный тест на предмет повторяемости вещи:

try:
    iter(thing)
except TypeError:
    do_whatever()

сбросит ваш файл.Точно так же рецепт itertools consume :

def consume(iterator, n=None):
    "Advance the iterator n-steps ahead. If n is None, consume entirely."
    # Use functions that consume iterators at C speed.
    if n is None:
        # feed the entire iterator into a zero-length deque
        collections.deque(iterator, maxlen=0)
    else:
        # advance to the empty slice starting at position n
        next(islice(iterator, n, n), None)

создаст неправильную позицию файла вместо продвижения n записей после consume(your_file, n).Пропуск первых нескольких записей с помощью next до того, как цикл также потерпит неудачу:

f = MySpecialFile(whatever)
next(f) # Skip a header, or try, anyway.
for record in f:
    # We get the header anyway.
    uhoh()
0 голосов
/ 04 октября 2018

Все, что подрывает предполагаемый поток языковой конструкции, является знаком опасности, хуже, чем просто «запах кода».Это не относится к Python;это применимо к любому языку или системе.

Однако, помните строчку о "хобгоблине маленьких умов":

  • Улучшает ли ваш reset ход программы?
  • Легко ли читать и понимать полученный код?

Если вы рассмотрели это для людей, которым придется это понимать и поддерживать - в том числе и для себя в будущем - тогда reset вполне может быть хорошей практикой.Я скептически отношусь, но я видел такие ситуации на работе.

Примечание : зачем вам нужен reset итератор при первом его создании?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...