[Python-ideas] adding dictionaries
Jonas Wielicki
j.wielicki at sotecware.net
Tue Jul 29 16:03:09 CEST 2014
On 29.07.2014 15:35, Steven D'Aprano wrote:
> On Mon, Jul 28, 2014 at 11:15:44PM -0700, Andrew Barnert wrote:
>> On Monday, July 28, 2014 8:34 PM, Steven D'Aprano <steve at pearwood.info> wrote:
>> [snip]
>>> * when called from a class, it should behave like a class method:
>>> MyMapping.merged(a, b, c) should return an instance of MyMapping;
>>>
>>> * but when called from an instance, it should behave like an instance
>>> method, with self included in the chain of mappings to merge:
>>> a.merged(b, c) rather than a.merged(a, b, c).
>>>
>>>
>>> I have a descriptor type which implements the behaviour from the last
>>> two bullet points, so from a technical standpoint it's not hard to
>>> implement this. But I can imagine a lot of push-back from the more
>>> conservative developers about adding a *fourth* method type (even if it
>>> is private) to the Python builtins, so it would take a really compelling
>>> use-case to justify adding a new method type and a new dict method.
>>>
>>> (Personally, I think this hybrid class/instance method type is far more
>>> useful than staticmethod, since I've actually used it in production
>>> code, but staticmethod isn't going away.)
>>
>>
>> How is this different from a plain-old (builtin or normal) method?
>
[snip]
> In the hybrid form I'm referring to, the first argument provided is the
> class when called from the class, and the instance when called from an
> instance. Imagine it written in pure Python like this:
>
> class dict:
> @hybridmethod
> def merged(this, *args, **kwargs):
> if isinstance(this, type):
> # Called from the class
> new = this()
> else:
> # Called from an instance.
> new = this.copy()
> for arg in args:
> new.update(arg)
> new.update(kwargs)
> return new
[snip]
I really like the semantics of that. This allows for concise, and in my
opinion, clearly readable code.
Although I think maybe one should have two separate methods: the class
method being called ``merged`` and the instance method called
``merged_with``. I find
result = somedict.merged(b, c)
somewhat less clear than
result = somedict.merged_with(b, c)
regards,
jwi
More information about the Python-ideas
mailing list