-1

I have a hard time upgrading from Python 2.7 to Python 3. Many many errors.

The code below that worked perfectly in Python 2.7 now gives me an error:

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)

I really don't understand what Python 3 wants from me. To somehow declare the iter type?

This is the relevant part of my code:

# 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 is a global gtk.ListStore(gtk.TreeIter)

Karl Knechtel
  • 62,466
  • 11
  • 102
  • 153
Luis A. Florit
  • 2,169
  • 1
  • 33
  • 58
  • Does this answer your question? [How can I iterate twice over the same data with a given iterator?](https://stackoverflow.com/questions/25336726/how-can-i-iterate-twice-over-the-same-data-with-a-given-iterator) – Karl Knechtel Jan 07 '23 at 07:12

1 Answers1

0

My question was answered here:

In Python 3, map returns an iterator, which you can only iterate over once. If you iterate over an iterator a second time, it will raise StopIteration immediately, as though it were empty. max consumes the whole thing, and min sees the iterator as empty. If you need to use the elements more than once, you need to call list to get a list instead of an iterator.

My program was built for Python 2, and I used a list of iters to refer to elements, that vanished in Python 3.

I still don't understand why Python 3 broke Python 2 in so many ways. Python 3 did not obey the most basic backward compatibility principles. Maybe someone here can explain me...

Luis A. Florit
  • 2,169
  • 1
  • 33
  • 58
  • The code in the question seems completely unrelated to the described solution. I know it has been over 2 years, but nowadays I hope you keep in mind the advice at [mre] when posting questions. – Karl Knechtel Jan 07 '23 at 07:13