On 31 Oct 2013 03:41, "Eric Snow" <ericsnowcurren...@gmail.com> wrote: > > On Tue, Oct 29, 2013 at 7:29 PM, Nick Coghlan <ncogh...@gmail.com> wrote: > > OK, time for me to stop trying to remember the details of the problem > > I'm trying to solve and go look them up in the source code :) > > > > One of my goals here is to be able to migrate extension loading from > > the old API to the new plugin API. That means being able to break up > > the existing load_module implementation: > > > > http://hg.python.org/cpython/file/1787277915e9/Python/importdl.c#l23 > > > > For loading, that's a fairly straightforward create_module/exec_module > > split, but reloading gets a bit more interesting. > > > > Specifically, I'd like to be able to implement the relevant parts of > > _PyImport_FindExtensionObject as a precheck for reloading: > > > > http://hg.python.org/cpython/file/1787277915e9/Python/import.c#l533 > > > > That means just having access to the module name isn't enough: the > > extensions dictionary is keyed by a (name, filename) 2-tuple rather > > than just by the module name. Using the find_spec API, that filename > > would be stored in the loader state on the spec object rather than > > being looked up anew during the load operation. > > > > However, rereading this method also indicates that I really want to > > know *in exec_module* whether this is a reload or not, since extension > > loading needs to handle reloads differently from initial execution. > > > > So I'm back to my original preference: I'd like the previous spec to > > be passed to exec_module in the reloading case. If reloading is not > > supported at all, it's up to the loader to throw an appropriate > > exception when the the previous spec is not None. If loading and > > reloading doesn't make any difference, then they can just ignore it. > > But when both are supported, but handled differently (as for extension > > modules), then that can be detected, and the information from the old > > spec (including the original loader and loader state) is available if > > needed. > > Our recent discovery about reloading should probably be reflected in > the signature of finder.find_spec(): > > MetaPathFinder.find_spec(name, path=None, existing=None) > PathEntryFinder.find_spec(name, existing=None) > > This way the finder has an opportunity to incorporate information from > an existing spec into the spec it returns. reload() would make use of > this by passing module.__spec__ (or None if the module has no > __spec__) to _bootstrap._find_spec(). > > This approach should also address what you are looking for. I'd > prefer it over passing the existing spec to exec_module(). The module > (and its __spec__) should have everything exec_module() needs to do > its job.
Yes, that should work. > We would still need to use loader.supports_reload() in reload(). Why? If the reload isn't supported, exec_module can just throw an exception based on the loader state in the spec. >From the import system's point of view "reload not permitted" is no different from any other exec time failure. Cheers, Nick.
_______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com