[Import-SIG] Round 2 for "A ModuleSpec Type for the Import System"

Nick Coghlan ncoghlan at gmail.com
Wed Aug 14 03:16:07 CEST 2013


On 13 Aug 2013 18:48, "Eric Snow" <ericsnowcurrently at gmail.com> wrote:
>
> On Tue, Aug 13, 2013 at 7:21 AM, Brett Cannon <brett at python.org> wrote:
>>
>> On Tue, Aug 13, 2013 at 12:17 AM, Eric Snow <ericsnowcurrently at gmail.com>
wrote:
>>>
>>> On Sun, Aug 11, 2013 at 2:08 PM, Brett Cannon <brett at python.org> wrote:
>>>>
>>>>
>>
>> [SNIP]
>>
>>>>
>>>>
>>>>>
>>>>>  ``module_repr()`` also conflicts with the same
>>>>> method on loaders, but that workaround is not complicated since both
are
>>>>> methods.
>>>>>
>>>>> Unfortunately, the ability to proxy does not extend to ``id()``
>>>>> comparisons and ``isinstance()`` tests.  In the case of the return
value
>>>>> of ``find_module()``, we accept that break in backward compatibility.
>>>>> However, we will mitigate the problem with ``isinstance()`` somewhat
by
>>>>> registering ``ModuleSpec`` on the loaders in ``importlib.abc``.
>>>>
>>>>
>>>> Actually, ModuleSpec doesn't even need to register; __instancecheck__
and __subclasscheck__ can just be defined and delegate by calling
issubclass/isinstance on the loader as appropriate.
>>>
>>>
>>> Do you mean add custom versions of those methods to
importlib.abc.Loader?
>>
>>
>> Nope, I meant ModuleSpec because every time I have a reason to override
something it's on the object and not the class and so I forget the support
is the other way around. Argh.
>
>
> Yeah, that would make things a lot easier.
>
>>>
>>>  That should work as well as the register approach.  It won't work for
all loaders but should be good enough.  I was just planning on registering
ModuleSpec on the loader in the setter for a `loader` property on
ModuleSpec.
>>
>>
>> But the registration is at the class level so how would that work?
>
>
> @property
> def loader(self):
>     return self._loader
>
> @loader.setter
> def loader(self, loader):
>     try:
>         register = loader.__class__.register
>     except AttributeError:
>         pass
>     else:
>         register(self.__class__)
>     self._loader = loader
>
> It's not pretty and it won't work on non-ABCs, but it's better than
nothing.  The likelihood of someone doing an isinstance check on a loader
seems pretty low though.  Of course, I'm planning on doing just that for
handling of namespace packages, but that's a little different.

That ends up registering ModuleSpec as an example of every loader ABC, so
it doesn't work at all. Making the importlib ABC hooks ModuleSpec aware (so
they knew to check the loader, not the spec) would be pretty easy, though.

>
> -eric
>
> _______________________________________________
> Import-SIG mailing list
> Import-SIG at python.org
> http://mail.python.org/mailman/listinfo/import-sig
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/import-sig/attachments/20130813/f2ae34f2/attachment-0001.html>


More information about the Import-SIG mailing list