[Python-ideas] Optional kwarg making attrgetter & itemgetter always return a tuple
Terry Reedy
tjreedy at udel.edu
Thu Sep 13 21:11:22 CEST 2012
On 9/13/2012 9:15 AM, Masklinn wrote:
> attrgetter and itemgetter are both very useful functions, but both have
> a significant pitfall if the arguments passed in are validated but not
> controlled: if receiving the arguments (list of attributes, keys or
> indexes) from an external source and *-applying it, if the external
> source passes a sequence of one element both functions will in turn
> return an element rather than a singleton (1-element tuple).
>
> This means such code, for instance code "slicing" a matrix of some sort
> to get only some columns and getting the slicing information from its
> caller (in situation where extracting a single column may be perfectly
> sensible) will have to implement a manual dispatch between a "manual"
> getitem (or getattr) and an itemgetter (resp. attrgetter) call, e.g.
>
> slicer = (operator.itemgetter(*indices) if len(indices) > 1
> else lambda ar: [ar[indices[0]])
>
> This makes for more verbose and less straightforward code, I think it
> would be useful to such situations if attrgetter and itemgetter could be
> forced into always returning a tuple by way of an optional argument:
>
> # works the same no matter what len(indices) is
> slicer = operator.itemgetter(*indices, force_tuple=True)
>
> which in the example equivalences[0] would be an override (to False) of
> the `len` check (`len(items) == 1` would become `len(items) == 1 and not
> force_tuple`)
>
> The argument is backward-compatible as neither function currently
> accepts any keyword argument.
>
> Uncertainty note: whether force_tuple (or whatever its name is)
> silences the error generated when len(indices) == 0, and returns
> a null tuple rather than raising a TypeError.
>
> [0] http://docs.python.org/dev/library/operator.html#operator.attrgetter
This seems like a plausible idea. The actual C version requires one
argument. The Python equivalent in the doc does not (hence the different
signature), as it would return an empty tuple for empty *items.
--
Terry Jan Reedy
More information about the Python-ideas
mailing list