Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
727 views
in Technique[技术] by (71.8m points)

python - imported modules becomes None when replacing current module in sys.modules using a class object

an unpopular but "supported" python hack (see Guido: https://mail.python.org/pipermail/python-ideas/2012-May/014969.html) that enables __getattr__ usage on module attributes involves the following:

import os, sys

class MyClass(object):

    def check_os(self):
        print os

sys.modules[__name__] = MyClass()

On import, this the imported module becomes a class instance:

>>> import myModule
>>> myModule
<myModule.MyClass object at 0xf76def2c>

However, in Python-2.7, all other imported modules within the original module is set to None.

>>> repro.check_os()
None

In Python-3.4, everything works:

>>> repro.check_os()
<module 'os' from '/python/3.4.1/lib/python3.4/os.py'>

This feels like something to do with Imported modules become None when running a function, but, anyone knows why this happens internally?

It seems that if you store the original module (without fully replacing it in Python-2) then everything continues to work:

sys.modules[__name__+'_bak'] = sys.modules[__name__]      
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

The problem you are running in to is that in Pythons prior to 3.4 when a module is destroyed (as yours is because you replace it with a class and there are no further references to it), the items in that module's __dict__ are forcibly set to None.

The workaround, if you need to support Pythons prior to 3.4, is have an import statement in the class that will replace the module:

class MyClass(object):

    import os

    def check_os(self):
        print(os)

For more info, see this answer about interpreter shutdown.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...