[Python-Dev] avoiding accidental shadowing of top-level libraries by the main module (original) (raw)

Michael Foord fuzzyman at voidspace.org.uk
Tue Jul 13 00:27:48 CEST 2010


On 12/07/2010 22:59, Antoine Pitrou wrote:

On Mon, 12 Jul 2010 17:47:31 -0400 Fred Drake<fdrake at acm.org> wrote:

On Mon, Jul 12, 2010 at 5:42 PM, Michael Foord <fuzzyman at voidspace.org.uk> wrote:

I'm sure Brett will love this idea, but if it was impossible to reimport the script being executed as main with a different name it would solve these problems. Indeed! And I'd be quite content with such a solution, since I consider scripts and modules to be distinct. Except that modules can often be executed as scripts...

Allowing a module-executed-as-script to be in sys.modules twice with different names and classes is still a recipe for problems. For example see this blog entry from Phil Hassey, an experienced Python developer, caused by this issue:

http://www.philhassey.com/blog/2009/07/16/oddball-python-252-import-issue/

For scripts that need to be in sys.modules with their "real" name (e.g. modules executed with python -m) the following trivial workaround is possible:

if name == 'main': sys.modules[real_name] = sys.modules['main']

That avoids the problem of error messages like:

TypeError: unbound method foo() must be called with A instance as first argument (got A instance instead)

(Two different classes with the same name created - one from main and one from real_name.) Use cases for genuinely reimporting the same module with different names (as different module objects rather than aliases) are relatively rare, and the problem of modules accidentally reimporting themselves not that rare.

All the best,

Michael

Antoine.


Python-Dev mailing list Python-Dev at python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/fuzzyman%40voidspace.org.uk

-- http://www.ironpythoninaction.com/ http://www.voidspace.org.uk/blog

READ CAREFULLY. By accepting and reading this email you agree, on behalf of your employer, to release me from all obligations and waivers arising from any and all NON-NEGOTIATED agreements, licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap, confidentiality, non-disclosure, non-compete and acceptable use policies (”BOGUS AGREEMENTS”) that I have entered into with your employer, its partners, licensors, agents and assigns, in perpetuity, without prejudice to my ongoing rights and privileges. You further represent that you have the authority to release me from any BOGUS AGREEMENTS on behalf of your employer.



More information about the Python-Dev mailing list