itemgetter with default arguments
Peter Otten
__peter__ at web.de
Mon May 7 11:45:26 EDT 2018
Antoon Pardon wrote:
> On 05-05-18 09:33, Peter Otten wrote:
>> I think you have established that there is no straight-forward way to
>> write this as a lambda. But is adding a default to itemgetter the right
>> conclusion?
>>
>> If there were an exception-catching decorator you could write
>>
>> f = catch(IndexError, "spam")(itemgetter(2))
>
> I think your catch function would be a usefull addition, but I don't see
> it solving this problem once we use itemgetter te get multiple entries.
Good catch()
;)
The obvious way, expressing the n-tuple case in terms of the solution for
scalars
>>> f = lambda items: tuple(catch(IndexError, "spam")(itemgetter(i))(items)
for i in (2, 1, 5))
>>> >>> f("abc")
('c', 'b', 'spam')
is a bit too complex to inline -- and also inefficient. You'd be tempted to
factor out the repetetive parts
>>> f = lambda items, gets=[catch(IndexError, "spam")(itemgetter(i)) for i
in (2, 1, 5)]: tuple(get(items) for get in gets)
>>> f("abc")
('c', 'b', 'spam')
and thus make it even less readable.
That said -- grepping my code I'm a bit surprised to find only
17 itemgetter(0)
9 itemgetter(1)
1 itemgetter(1, 0)
1 itemgetter(*indices)
Checking /usr/lib/python3/dist-packages it looks like the situation is
similar. I conclude that the most useful addition to the operator module
would be
first = itemgetter(0)
second = itemgetter(1)
More information about the Python-list
mailing list