Python3: утверждение 'iter_is_valid (iter, list_store)' не удалось - PullRequest
0 голосов
/ 26 мая 2020

Мне сложно обновить Python 2.7 до Python 3. Много, много ошибок.

Код ниже, который отлично работал в Python 2.7, теперь выдает ошибку:

gtk_list_store_get_value: assertion 'iter_is_valid (iter, list_store)' failed
 Traceback (most recent call last):
  File "/home/gato/bin/ave.py", line 1586, in writing
    result = self.grepa(str(entry_text.encode('iso-8859-1')))
  File "/home/gato/bin/ave.py", line 1453, in grepa
    iterr = self.grep3(self.iniiterlist, regex)
  File "/home/gato/bin/ave.py", line 1442, in grep3
    flds = flds+self.database[self.activelist_iters[iterr][0]][i]
  File "/usr/lib64/python3.8/site-packages/gi/overrides/Gtk.py", line 1129, in __getitem__
    return self.model.get_value(self.iter, key)
TypeError: unknown type (null)

Я правда не понимаю, что Python 3 хочет от меня. Чтобы как-то объявить тип iter?

Это соответствующая часть моего кода:

# Get iter of the first match beginning with iterr in current birdlist;
# assumes regex extends (1,2 or 3 fields)
def grep3(self, iterr, regex):
    # Usar los iters en self.activelist_iters
    while iterr:
        flds = ""
        for i in self.searchfields:
            #flds = flds+self.database.get_value(iterr, i)
            flds = flds+self.database[self.activelist_iters[iterr][0]][i]
        if re.search(regex, flds):
            return iterr
        iterr = self.activelist_iters.iter_next(iterr)
    return

# Get a list of iter of all matches in current birdlist;
# assumes regex extends (1,2 or 3 fields)
def grepa(self, regex):
    out = []
    regex = regex_repl(regex, True)
    iterr = self.grep3(self.iniiterlist, regex)
    while iterr:
        out.append(iterr)
        iterr = self.grep3(self.activelist_iters.iter_next(iterr), regex)

    return out

BTW, activelist_iters глобальный gtk.ListStore(gtk.TreeIter)

1 Ответ

0 голосов
/ 10 июня 2020

На мой вопрос был дан ответ здесь :

В Python 3 map возвращает итератор, который можно выполнить только один раз. Если вы перебираете итератор во второй раз, он немедленно вызовет StopIteration, как если бы он был пуст. max потребляет все, а min видит итератор пустым. Если вам нужно использовать элементы более одного раза, вам нужно вызвать list, чтобы получить список вместо итератора.

Моя программа была создана для Python 2, и я использовал список iters для обозначения элементов, которые исчезли в Python 3.

Я до сих пор не понимаю, почему Python 3 сломал Python 2 так многими способами. Python 3 не подчинялся большинству c принципов обратной совместимости. Может быть, здесь кто-нибудь объяснит мне ...

...