[Python-Dev] itertools addition: getitem()
Walter Dörwald
walter at livinglogic.de
Sun Jul 8 22:00:30 CEST 2007
Guido van Rossum wrote:
> On 7/8/07, Walter Dörwald <walter at livinglogic.de> wrote:
> [quoting Guido]
>> > But I still want to hear of a practical use case for the default here.
>>
>> In most cases
>>
>> foo = getitem(iterable, 0, None)
>> if foo is not None:
>> ...
>>
>> is simpler than:
>>
>> try:
>> foo = getitem(iterable, 0)
>> except IndexError:
>> pass
>> else:
>> ...
>>
>> Here is a use case from one of my "import XML into the database" scripts:
>>
>> compid = getitem(root[ns.Company_company_id], 0, None)
>> if compid:
>> compid = int(compid)
>>
>> The expression root[ns.company_id] returns an iterator that produces all
>> children of the root node that are of the element type company_id. If
>> there is a company_id its content will be turned into an int, if not
>> None will be used.
>
> Ahem. I hope you have a better use case for getitem() than that
> (regardless of the default issue). I find it clearer to write that as
>
> try:
> compid = root[ns.company_id].next()
> except StopIteration:
> compid = None
> else:
> compid = int(compid)
>
> While this is more lines, it doesn't require one to know about
> getitem() on an iterator. This is the same reason why setdefault() was
> a mistake -- it's too obscure to invent a compact spelling for it
> since the compact spelling has to be learned or looked up.
Well I have used (a Python version of) this getitem() function to
implement a library that can match a CSS3 expression against an XML
tree. For implementing the nth-child(), nth-last-child(), nth-of-type()
and nth-last-of-type() pseudo classes (see
http://www.w3.org/TR/css3-selectors/#structural-pseudos) getitem() was
very useful.
Servus,
Walter
More information about the Python-Dev
mailing list