Re: Round 2 for "A ModuleSpec Type for the Import System"

Eric Snow <[email protected]>
Newsgroups gmane.comp.python.import
Message-ID <CALFfu7AEkqf_doNptYO4+xN8HV4V_f7PDOV-JdZUVW9O0hw_sQ@mail.gmail.com>
Accidently sent. :P

Continuing...


> On Sun, Aug 11, 2013 at 7:03 AM, Nick Coghlan <[email protected]> wrote:
>
>> > Subclassing
>>
> > -----------
>> >
>> > Subclasses of ModuleSpec are allowed, but should not be necessary.
>> > Adding functionality to a custom finder or loader will likely be a
>> > better fit and should be tried first.  However, as long as a subclass
>> > still fulfills the requirements of the import system, objects of that
>> > type are completely fine as the return value of ``find_module()``.
>>
>> We may need to do subclasses for the ABC registration backwards
>> compatibility hack.
>
>
I was thinking of registering ModuleSpec in the setter of a `loader`
property (as long as the loader's class has a `register()` method


>> >
>> > Module Objects
>> > --------------
>> >
>> > Module objects will now have a ``__spec__`` attribute to which the
>> > module's spec will be bound.  None of the other import-related module
>> > attributes will be changed or deprecated, though some of them could be;
>> > any such deprecation can wait until Python 4.
>> >
>> > ``ModuleSpec`` objects will not be kept in sync with the corresponding
>> > module object's import-related attributes.  Though they may differ, in
>> > practice they will typically be the same.
>>
>> Worth mentioning that __main__.__spec__.name will give the real name
>> of module's executed with -m here rather than delaying that until the
>> notes at the end.
>>
>
Fair enough.


>
>> > Finders
>> > -------
>> >
>> > Finders will now return ModuleSpec objects when ``find_module()`` is
>> > called rather than loaders.  For backward compatility, ``Modulespec``
>> > objects proxy the attributes of their ``loader`` attribute.
>> >
>> > Adding another similar method to avoid backward-compatibility issues
>> > is undersireable if avoidable.  The import APIs have suffered enough,
>> > especially considering ``PathEntryFinder.find_loader()`` was just
>> > added in Python 3.3.  The approach taken by this PEP should be
>> > sufficient to address backward-compatibility issues for
>> > ``find_module()``.
>> >
>> > The change to ``find_module()`` applies to both ``MetaPathFinder`` and
>> > ``PathEntryFinder``.  ``PathEntryFinder.find_loader()`` will be
>> > deprecated and, for backward compatibility, implicitly special-cased if
>> > the method exists on a finder.
>>
>> Actually, we don't currently have anything on ModuleSpec to indicate
>> "this is complete, stop scanning for more path fragments" or how we
>> will compose multiple module specs for the individual fragments into a
>> combined spec for the namespace package.
>>
>
I was planning on just using the loader's type.  If it's NamespaceLoader
then path is where we'll get the fragments.  I was going to say it's
working in my implementation, but namespace packages are actually the one
part that still have some failing tests. :P


>
>> > Finders are still responsible for creating the loader.  That loader will
>> > now be stored in the module spec returned by ``find_module()`` rather
>> > than returned directly.  As is currently the case without the PEP, if a
>> > loader would be costly to create, that loader can be designed to defer
>> > the cost until later.
>> >
>> > Loaders
>> > -------
>> >
>> > Loaders will have a new method, ``exec_module(module)``.  Its only job
>> > is to "exec" the module and consequently populate the module's
>> > namespace.  It is not responsible for creating or preparing the module
>> > object, nor for any cleanup afterward.  It has no return value.
>> >
>> > The ``load_module()`` of loaders will still work and be an active part
>> > of the loader API.  It is still useful for cases where the default
>> > module creation/prepartion/cleanup is not appropriate for the loader.
>> >
>> > For example, the C API for extension modules only supports the full
>> > control of ``load_module()``.  As such, ``ExtensionFileLoader`` will not
>> > implement ``exec_module()``.  In the future it may be appropriate to
>> > produce a second C API that would support an ``exec_module()``
>> > implementation for ``ExtensionFileLoader``.  Such a change is outside
>> > the scope of this PEP.
>>
>> As above, I think it may worth tackling this. It shouldn't be *that*
>> hard given the higher level changes and will solve some hard problems
>> at the lower level.
>>
>
For me that seems like a separate proposal.  Certainly it's related, but in
some ways it would feel tacked on.  On top of that, I'd have to dive into
the extension module API much more than I have and I'd rather get
ModuleSpec and .ref file wrapped up sooner.  At the same time, I haven't
really done much API design in C so that would be interesting.  In the end,
I'd like to keep the extension module API additions out of this PEP.

-eric

_______________________________________________
Import-SIG mailing list
[email protected]
http://mail.python.org/mailman/listinfo/import-sig
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.