Re: iterating over DictRow

From: Karsten Hilbert <Karsten(dot)Hilbert(at)gmx(dot)net>
To: psycopg(at)lists(dot)postgresql(dot)org
Subject: Re: iterating over DictRow
Date: 2020-09-25 07:48:20
Message-ID: 20200925074820.GC2138@hermes.hilbert.loc
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: psycopg

Adrian,

thanks for tracing my misunderstanding. I should have
confirmed my suspicion here:

> https://github.com/psycopg/psycopg2/blob/fbba461052ae6ebc43167ab69ad91cadb7914c83/lib/extras.py

> class DictRow(list):

> def __getitem__(self, x):
> if not isinstance(x, (int, slice)):
> x = self._index[x]
> return super(DictRow, self).__getitem__(x)
>
> So if the value passed to __getitem__() is a integer or slice it does a list
> index.

Indeed. I wonder whether that should be mentioned in the
psycopg2 docs somewhere as it might be considered to violate
the Principle Of Least Astonishment.

Or rather, this issues seems unfortunate fallout from python3:

In py2 one *had* to do DictRow.keys() to iterate over the
keys. In py3

for key in DictRow:

is the suggested idiom for that which, however, iterates over
DictRow as a list (as it always did).

DictRow.keys() still exists on dicts in py3 (and is not
deprec(i?)ated to my knowledge) but now returns a memoryview
(dict_keys, that is) rather than a list, which brings with it
its own set of issues (dict and keys "list" are not
independant objects anymore).

So, neither using py2's

for key in DictRow.keys():

under py3 nor changing to py3's

for key in DictRow: # beep: variable wrongly named

leads to fully equivalent code. So this is a py2/py3 Gotcha
in psycopg2.

Not that I complain, but worth a mention in the DictRow docs
somewhere ?

Karsten
--
GPG 40BE 5B0E C98E 1713 AFA6 5BC0 3BEA AC80 7D4F C89B

In response to

Responses

Browse psycopg by date

  From Date Subject
Next Message Adrian Klaver 2020-09-25 16:06:43 Re: iterating over DictRow
Previous Message Adrian Klaver 2020-09-25 01:00:54 Re: iterating over DictRow