Как изменить счетчик цикла for в python? - PullRequest
0 голосов
/ 07 июня 2019

Можно ли изменить счетчик цикла внутри исключения?

Я пробовал использовать другой синтаксис. Он работает внутри исключения, но когда цикл выполняется снова, изменение не применяется.

for b in range(6, len(attribute_column)):
    try:
        print(b)
        print(attribute_column[b])
        qu = """ALTER TABLE products ADD %s NVARCHAR(200)""" % (attribute_column[b])
        mycursor.execute(qu)
    #if there is a multivalued column in json, POP the value and save it for another insertion
    except mysql.connector.errors.ProgrammingError:
        print(b)
        attribute_column.pop(b)
        redundant_values[attribute_column[b]] = attribute_value.pop(b)
        b = b-1
        print(b)

Вывод такой:

6
7
8
9
9
8
10
11
12
13
14
15

Мне нужно, чтобы это было:

6
7
8
9
9
8
9
10
11
12
13
14
15

1 Ответ

0 голосов
/ 08 июня 2019

Не оценивая весь ваш подход, но в целом, если вам нужны произвольные изменения состояния в счетчике, вы можете написать свой собственный итератор:

class Cursor:

    def __init__(self, start, end):
        self.end = end
        self.position = start

    def __next__(self):
        if self.position >= self.end:
            raise StopIteration
        else:
            self.position += 1
            return  self.position - 1

    def __iter__(self):
        return self

    def revert(self, n=1):
        self.position -= n + 1

Пример:

if __name__ == '__main__':

    cursor = Cursor(6, 16)
    it = iter(range(3, -20, -1)) # for demo

    for i in cursor:
        print(i)
        try:
            i / next(it)
        except ZeroDivisionError:
            print("Error on:", i)
            cursor.revert(1)

Выход:

6
7
8
9
Error on: 9
8
9
10
11
12
13
14
15

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