[issue14003] __self__ on built-in functions is not as documented
New submission from Роман Донченко <DXDragon@yandex.ru>: The language reference says this in section 3.2: ~ Built-in functions A built-in function object is a wrapper around a C function. Examples of built-in functions are len() and math.sin() <...> Special read-only attributes: <...> __self__ is set to None (but see the next item) <...>. ~ That is not the case: ActivePython 3.2.2.3 (ActiveState Software Inc.) based on Python 3.2.2 (default, Sep 8 2011, 10:55:13) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information.
len.__self__ <module 'builtins' (built-in)> open.__self__ <module 'io' (built-in)> import math math.sin.__self__ <module 'math' (built-in)>
---------- assignee: docs@python components: Documentation messages: 153287 nosy: SpecLad, docs@python priority: normal severity: normal status: open title: __self__ on built-in functions is not as documented type: behavior versions: Python 3.2 _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue14003> _______________________________________
R. David Murray <rdmurray@bitdance.com> added the comment: It looks like this changed between 2.x and 3.x but the docs were not updated. None makes more sense than the module as __self__, though, so perhaps it is actually a bug. Then, again, since Python functions don't have a __self__, the __self__ of built-in functions seems like an anomaly to begin with... ---------- nosy: +r.david.murray versions: +Python 3.3 _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue14003> _______________________________________
Michael Foord <michael@voidspace.org.uk> added the comment: It's nicer for introspection if __self__ is None on builtin functions. But fixing the docs is easier (and more backwards compatible). ---------- nosy: +michael.foord _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue14003> _______________________________________
Terry J. Reedy <tjreedy@udel.edu> added the comment: Python-coded functions do not have .__self__.
def f(): pass
f.__self__ ... AttributeError: 'function' object has no attribute '__self__'
Unbound builtin methods, which are simply builtins functions attached to a class, do not have .__self__
list.__len__.__self__ ... AttributeError: 'wrapper_descriptor' object has no attribute '__self__'
So it makes no sense to me that builtin non-method functions should have this attribute. "Built-in methods This is really a different disguise of a built-in function, this time containing an object passed to the C function as an implicit extra argument. An example of a built-in method is alist.append(), assuming alist is a list object. In this case, the special read-only attribute __self__ is set to the object denoted by alist." should have 'method' replaced with 'instance method' as it is only talking about instance methods, as the term is used in the rest of the section. Or this section should be deleted as it duplicates the previous Instance Method section. Or it should be revised to actually discuss unbound builtin methods. ---------- nosy: +terry.reedy _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue14003> _______________________________________
Changes by Matt Joiner <anacrolix@gmail.com>: ---------- nosy: +anacrolix _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue14003> _______________________________________
Éric Araujo <merwok@netwok.org> added the comment: I think that functions in C modules are implemented as methods of module objects, which would explain why len.__self__ is builtins. ---------- nosy: +eric.araujo _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue14003> _______________________________________
Changes by Ezio Melotti <ezio.melotti@gmail.com>: ---------- nosy: +ezio.melotti _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue14003> _______________________________________
Changes by Arfrever Frehtes Taifersar Arahesis <Arfrever.FTA@GMail.Com>: ---------- nosy: +Arfrever _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue14003> _______________________________________
Changes by Ezio Melotti <ezio.melotti@gmail.com>: ---------- stage: -> needs patch _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue14003> _______________________________________
Changes by Dmitry Kazakov <jsbfox@gmail.com>: ---------- nosy: +vlth _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue14003> _______________________________________
eryksun added the comment: In Python 2 [Py_InitModule4][1] optionally allows setting __self__ on module functions, but no module in the standard library actually uses this. It's always None. This is no longer optional with Python 3's [PyModule_Create][2]. Built-in module functions instantiated the normal way can be considered as methods of the module in which they're defined. However, some modules may specially instantiate functions for which __self__ is None, such as codecs.strict_errors. >>> codecs.strict_errors.__self__ is None True [1]: https://docs.python.org/2/c-api/allocation.html#c.Py_InitModule4 [2]: https://docs.python.org/3/c-api/module.html#c.PyModule_Create ---------- nosy: +eryksun _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue14003> _______________________________________
Changes by Jim Fasarakis-Hilliard <d.f.hilliard@gmail.com>: ---------- nosy: +Jim Fasarakis-Hilliard _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue14003> _______________________________________
Change by Irit Katriel <iritkatriel@yahoo.com>: ---------- versions: +Python 3.10, Python 3.8, Python 3.9 -Python 3.2, Python 3.3 _______________________________________ Python tracker <report@bugs.python.org> <https://bugs.python.org/issue14003> _______________________________________
participants (12)
-
Arfrever Frehtes Taifersar Arahesis
-
Dmitry Kazakov
-
eryksun
-
Ezio Melotti
-
Irit Katriel
-
Jim Fasarakis-Hilliard
-
Matt Joiner
-
Michael Foord
-
R. David Murray
-
Terry J. Reedy
-
Éric Araujo
-
Роман Донченко