[Python-ideas] Add "default" kw argument to operator.itemgetter and operator.attrgetter

Vincent Maillol vincent.maillol at gmail.com
Tue May 8 04:13:43 EDT 2018


>
> As attrgetter/itemgetter might get heterogeneus data, I would expect a
> per-get default, not [just] a global default.
>
+1

Perhaps something like:
>

> >>> itemgetter(-1, 0, -2,
> ...            default0="first argument default",
> ...            default1=["second", "argument", "default"],
> ...            default={"global": "default"},
> ... )
>

The keywords suffixed by indice are uncommon. Maybe we can use dedicated
object.

>>> itemgetter(
...     itemgetter.WithDefault(-1, "first argument default"),
...     itemgetter.WithDefault(0, ["second", "argument", "default"])
...     -2  # has no default value
... )

Another possibility is that itemgetter becomes an object with `add_default`
method.

>>> getter = itemgetter(-1, 0, 2)
>>> getter.add_default(0, "first argument default")
>>> getter.add_default(2, "third argument default")

or simply default parameter should be a list

>>> itemgetter(-1, 0, 2,
...            default=["first", itemgetter.NoDefault, "third"])



2018-05-08 1:37 GMT+02:00 Danilo J. S. Bellini <danilo.bellini at gmail.com>:

> (1)
>
> On 7 May 2018 at 01:07, Raymond Hettinger <raymond.hettinger at gmail.com>
> wrote:
>
>> He could've written:
>>
>>     get = rpartial(getattr, 'foo', None)
>>     return get(args) or get(config) or get(env)
>>
>
> That's somewhat hybrid, it would behave like:
>
> lambda obj: getattr(obj, "foo", None),
>
> but one might expect a "reversed partial" to have its arguments reversed
> as well, like:
>
> lambda obj: getattr(obj, None, "foo").
>
> (2)
>
> Why getattr can't accept keyword arguments?
>
> >>> getattr_zero = partial(getattr, default=0)
> >>> getattr_zero({}, "blah")
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> TypeError: getattr() takes no keyword arguments
>
> Since partial/partialmethod can apply keyword arguments, allowing the
> "default=" keyword argument in getattr would be an alternative to the
> "rpartial".
>
> (3)
>
> At one time, lambda was the one obvious way. [...]
>>
>
> I really like lambdas, but there are some "closure gotchas" like:
>
> >>> for idx in indices:
> ...     do_something(lambda seq: seq[idx])
>
> If the lambda is stored somewhere to be called after the loop ends (or
> after its iteration), the seq[idx] would load the item with the last
> iterated index. This:
>
> >>> for idx in indices:
> ...     do_something(itemgetter(idx))
>
> would behave more like this instead:
>
> >>> for idx in indices:
> ...     do_something((lambda i: (lambda seq: seq[i]))(idx))
>
> Which I wouldn't call "the one obvious way".
>
> (4)
>
> If itemgetter and attrgetter only did a single lookup, a default might
>> make sense.  However, that doesn't fit well with multiple and/or chained
>> lookups where are number of options are possible. (See
>> https://bugs.python.org/issue14384#msg316222 for examples and
>> alternatives).
>
> As attrgetter/itemgetter might get heterogeneus data, I would expect a
> per-get default, not [just] a global default.
> Perhaps something like:
>
> >>> itemgetter(-1, 0, -2,
> ...            default0="first argument default",
> ...            default1=["second", "argument", "default"],
> ...            default={"global": "default"},
> ... )
>
> --
> Danilo J. S. Bellini
> ---------------
> "*It is not our business to set up prohibitions, but to arrive at
> conventions.*" (R. Carnap)
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180508/3d7eb170/attachment-0001.html>


More information about the Python-ideas mailing list