
Le 05/03/2019 à 23:40, Greg Ewing a écrit :
Steven D'Aprano wrote:
The question is, is [recursive merge] behaviour useful enough and common enough to be built into dict itself? I think not. It seems like just one possible way of merging values out of many. I think it would be better to provide a merge function or method that lets you specify a function for merging values.
That's what this conversation led me to. I'm not against the addition for the most general usage (and current PEP's describes the behaviour I would expect before reading the doc), but for all other more specific usages, where we intend any special or not-so-common behaviour, I'd go with modifying Dict.update like this:
foo.update(bar, on_collision=updator) # Although I'm not a fan of the keyword I used This won’t be possible update() already takes keyword arguments:
foo = {} bar = {'a': 1} foo.update(bar, on_collision=lambda e: e) foo {'a': 1, 'on_collision': <function <lambda> at 0x10b8df598>} I don't see that as a problem at all. Having a function's signature containing a **kwargs doesn't disable to have explicit keyword arguments at the same time: `def foo(bar="baz", **kwargs):` is perfectly valid, as well as `def spam(ham: Dict, eggs="blah", **kwargs):`, so `update(other, on_collision=None, **added) is too, no? The major implication to such a modification of the Dict.update method, is that when you're using it with keyword arguments (by opposition to passing another dict/iterable as positional), you're making a small non-backward compatible change in
Le 06/03/2019 à 10:50, Rémi Lapeyre a écrit : that if in some code, someone was already using the keyword that would be chosing (here "on_collision"), their code would be broken by the new feature. I had never tried to pass a dict and kw arguments together, as it seemed to me that it wasn't supported (I would even have expected an exception to be raised), but it's probably my level of English that isn't high enough to get it right, or this part of the doc that doesn't describe well the full possible usage of the method (see here: https://docs.python.org/3/library/stdtypes.html#dict.update). Anyway, if the keyword is slected wisely, the collision case will almost never happen, and be quite easy to correct if it ever happened.