[Python-checkins] peps: PEP 3155 - Qualified name for classes and functions

antoine.pitrou python-checkins at python.org
Sun Oct 30 00:05:41 CEST 2011


http://hg.python.org/peps/rev/460e0a1a004f
changeset:   3972:460e0a1a004f
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Sun Oct 30 00:01:30 2011 +0200
summary:
  PEP 3155 - Qualified name for classes and functions

files:
  pep-3155.txt |  132 +++++++++++++++++++++++++++++++++++++++
  1 files changed, 132 insertions(+), 0 deletions(-)


diff --git a/pep-3155.txt b/pep-3155.txt
new file mode 100644
--- /dev/null
+++ b/pep-3155.txt
@@ -0,0 +1,132 @@
+PEP: 3155
+Title: Qualified name for classes and functions
+Version: $Revision$
+Last-Modified: $Date$
+Author: Antoine Pitrou <solipsis at pitrou.net>
+Status: Draft
+Type: Standards Track
+Content-Type: text/x-rst
+Created: 2011-10-29
+Python-Version: 3.3
+Post-History:
+Resolution: TBD
+
+
+Rationale
+=========
+
+Python's introspection facilities have long had poor support for nested
+classes.  Given a class object, it is impossible to know whether it was
+defined inside another class or at module top-level; and, if the former,
+it is also impossible to know in which class it was defined.  While
+use of nested classes is often considered poor style, the only reason
+for them to have second class introspection support is a lousy pun.
+
+Python 3 adds insult to injury by dropping what was formerly known as
+unbound methods.  In Python 2, given the following definition::
+
+    class C:
+        def f():
+            pass
+
+you can then walk up from the ``C.f`` object to its defining class::
+
+    >>> C.f.im_class
+    <class '__main__.C'>
+
+This possibility is gone in Python 3::
+
+    >>> C.f.im_class
+    Traceback (most recent call last):
+      File "<stdin>", line 1, in <module>
+    AttributeError: 'function' object has no attribute 'im_class'
+    >>> dir(C.f)
+    ['__annotations__', '__call__', '__class__', '__closure__', '__code__',
+    '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__',
+    '__eq__', '__format__', '__ge__', '__get__', '__getattribute__',
+    '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__',
+    '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__',
+    '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
+    '__str__', '__subclasshook__']
+
+This limits again the introspection capabilities available to the user.
+It can produce actual issues when porting software to Python 3, for example
+Twisted Core where the issue of introspecting method objects came up
+several times.  It also limits pickling support [1]_.
+
+
+Proposal
+========
+
+This PEP proposes the addition of a ``__qname__`` attribute to functions
+and classes.  For top-level functions and classes, the ``__qname__``
+attribute is equal to the ``__name__`` attribute.  For nested classed,
+methods, and nested functions, the ``__qname__`` attribute contains a
+dotted path leading to the object from the module top-level.
+
+The repr() and str() of functions and classes is modified to use ``__qname__``
+rather than ``__name__``.
+
+Example with nested classes
+---------------------------
+
+>>> class C:
+...   def f(): pass
+...   class D:
+...     def g(): pass
+...
+>>> C.__qname__
+'C'
+>>> C.f.__qname__
+'C.f'
+>>> C.D.__qname__
+'C.D'
+>>> C.D.g.__qname__
+'C.D.g'
+
+Example with nested functions
+-----------------------------
+
+>>> def f():
+...   def g(): pass
+...   return g
+...
+>>> f.__qname__
+'f'
+>>> f().__qname__
+'f.g'
+
+
+Limitations
+===========
+
+With nested functions (and classes defined inside functions), the dotted
+path will not be walkable programmatically as a function's namespace is not
+available from the outside.  It will still be more helpful to the human
+reader than the bare ``__name__``.
+
+As the ``__name__`` attribute, the ``__qname__`` attribute is computed
+statically and it will not automatically follow rebinding.
+
+
+References
+==========
+
+.. [1] "pickle should support methods":
+   http://bugs.python.org/issue9276
+
+Copyright
+=========
+
+This document has been placed in the public domain.
+
+
+
+..
+   Local Variables:
+   mode: indented-text
+   indent-tabs-mode: nil
+   sentence-end-double-space: t
+   fill-column: 70
+   coding: utf-8
+   End:

-- 
Repository URL: http://hg.python.org/peps


More information about the Python-checkins mailing list