Issue 32070: Clarify the behavior of the staticmethod builtin (original) (raw)

It looks like the original staticmethod docstring might have been based on the classmethod docstring, and it seems like the current description might not be accurate.

Current string:

...It can be called either on the class (e.g. C.f()) or on an instance (e.g. C().f()); the instance is ignored except for its class...

Proposed change:

It can be called either on the class (e.g. C.f()) or on an instance (e.g. C().f()). Both the class and the instance are ignored, and neither is passed implicitly as the first argument to the method.

ISTM the current wording is correct and aims to describe how staticmethods differ from regular methods. With a regular methods we have "c.m(*a) -> type(c).m(c, *a)" and "C.m(*a) -> C.m(*s)". With a class method, only the first of those changes to "c.m(*a) -> type(c).m(*a)". Expressed in English, this change is "the instance is ignored except for its class...".

That said, the staticmethod() docs could use a complete rewrite. They amble all over the place and don't directly speak to what a static method is for (attaching regular functions to classes to improve findability) or how they work (use descriptor logic to suppress the usual behavior of prepend "self" to the argument list when called from an instance) or a concise motivating example.