[Python-Dev] PEP 302 support for traceback, inspect, site, warnings, doctest, and linecache

Phillip J. Eby pje at telecommunity.com
Mon Apr 10 19:03:02 CEST 2006


Here's my plan for implementing PEP 302 support (``__loader__`` 
sensitivity) for the above modules:

* Change all of the ``linecache`` API functions (except ``clearcache()``) 
to add an optional ``module_globals`` argument, which they will use to 
obtain the ``__name__`` and ``__loader__`` in the event that the given 
filename doesn't exist, but appears to be the source file for the given 
module.  (That is, if the basename of the filename is consistent with the 
last part of the ``__name__`` in the module_globals, if 
``sys.modules[__name__].__dict__ is module_globals``, and the 
``__loader__`` (if any) in module_globals has a ``get_source()`` method.)

* Change ``inspect.getsourcefile()`` to return the source path as long as 
the object's module has a ``__loader__`` with a ``get_source()`` 
method.  This will ensure that other ``inspect`` functions will still try 
to load the source code for the object in question, even if it's in a 
zipfile or loaded by some other import mechanism.

* Change ``inspect.findsource()`` to pass the target object's module 
globals as an extra argument to ``linecache.getlines()``

* Change the ``traceback`` module to supply frame globals to the 
``linecache`` APIs it uses.

* Change the ``site`` module to not "absolutize" ``__file__`` attributes of 
modules with ``__loader__`` attributes; ``__loader__`` objects are 
responsible for their own ``__file__`` values.  (Actually, if this is 
desirable behavior, the builtin import machinery should be doing it, not 
site.py!)

* Add an optional ``module_globals`` argument to 
``warnings.warn_explicit()``, which will be passed through to 
``linecache.getlines()`` if the warning is not ignored.  (This will prime 
the line cache in case the warning is to be output.)

* Change ``warnings.warn()`` to pass the appropriate globals to 
``warn_explicit()``.

* Change ``doctest.testfile()`` and ``DocTestSuite`` to use the target 
module's ``__loader__.get_data()`` method (if available) to load the given 
doctest file.

* Change ``__patched_linecache_getlines()`` in ``doctest`` to accept an 
optional ``module_globals`` argument, to be passed through to the original 
``getlines()`` function.

I'm starting work on the above now.  If I finish early enough today, I'll 
follow up with plans for fixing ``pydoc``, which requires slightly more 
extensive surgery, since it doesn't even support packages with multiple 
``__path__`` entries yet, let alone PEP 302.

Please let me know if you have any questions or concerns.



More information about the Python-Dev mailing list