On Monday, July 28, 2014 8:34 PM, Steven D'Aprano <steve@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?
class Spam: ... def eggs(self, a): ... print(self, a) spam = Spam() Spam.eggs(spam, 2) <__main__.Spam object at 0x106377080> 2 spam.eggs(2) <__main__.Spam object at 0x106377080> 2 Spam.eggs <function __main__.eggs> spam.eggs <bound method Spam.eggs of <__main__.Spam object at 0x106377080>> s = {1, 2, 3} set.union(s, [4]) {1, 2, 3, 4} s.union([4]) {1, 2, 3, 4} set.union <method 'union' of 'set' objects> s.union
<function union> This is the way methods have always worked (although the details of how they worked under the covers changed in 3.0, and before that when descriptors and new-style classes were added).