<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sun, Nov 30, 2014 at 5:42 PM, Nathaniel Smith <span dir="ltr"><<a href="mailto:njs@pobox.com" target="_blank">njs@pobox.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Mon, Dec 1, 2014 at 1:27 AM, Guido van Rossum <<a href="mailto:guido@python.org">guido@python.org</a>> wrote:<br>
> Nathaniel, did you look at Brett's LazyLoader? It overcomes the subclass<br>
> issue by using a module loader that makes all modules instances of a<br>
> (trivial) Module subclass. I'm sure this approach can be backported as far<br>
> as you need to go.<br>
<br>
</span>The problem is that by the time your package's code starts running,<br>
it's too late to install such a loader. Brett's strategy works well<br>
for lazy-loading submodules (e.g., making it so 'import numpy' makes<br>
'numpy.testing' available, but without the speed hit of importing it<br>
immediately), but it doesn't help if you want to actually hook<br>
attribute access on your top-level package (e.g., making 'numpy.foo'<br>
trigger a DeprecationWarning -- we have a lot of stupid exported<br>
constants that we can never get rid of because our rules say that we<br>
have to deprecate things before removing them).<br>
<br>
Or maybe you're suggesting that we define a trivial heap-allocated<br>
subclass of PyModule_Type and use that everywhere, as a<br>
quick-and-dirty way to enable __class__ assignment? (E.g., return it<br>
from PyModule_New?) I considered this before but hesitated b/c it<br>
could potentially break backwards compatibility -- e.g. if code A<br>
creates a PyModule_Type object directly without going through<br>
PyModule_New, and then code B checks whether the resulting object is a<br>
module by doing isinstance(x, type(sys)), this will break. (type(sys)<br>
is a pretty common way to get a handle to ModuleType -- in fact both<br>
types.py and importlib use it.) So in my mind I sorta lumped it in<br>
with my Option 2, "minor compatibility break". OTOH maybe anyone who<br>
creates a module object without going through PyModule_New deserves<br>
whatever they get.<br>
<span class="HOEnZb"></span></blockquote><div><br></div><div>Couldn't you install a package loader using some install-time hook?<br><br></div><div>Anyway, I still think that the issues with heap types can be overcome. Hm, didn't you bring that up before here? Was the conclusion that it's impossible?<br></div><div> </div></div>-- <br><div class="gmail_signature">--Guido van Rossum (<a href="http://python.org/~guido">python.org/~guido</a>)</div>
</div></div>