创建自定义模块类时,为什么导入不起作用?

时间:2012-10-08 08:45:41

标签: python module

我有这个模块wat.py

import re
import types
import sys

hello = "Hello World"

class MyModule(types.ModuleType):
    def get_re(self):
        return re
    def get_hello(self):
        return hello


sys.modules[__name__] = MyModule('wat')

我运行此代码:

>>> import wat
>>> wat.get_hello()
None
>>> wat.get_re()
None

为什么这不起作用?

3 个答案:

答案 0 :(得分:1)

此代码使其有效:

import types
import sys

def whyDoesThisWorkIDontEven():
    import re
    hello = "Hello World"

    class MyModule(types.ModuleType):
        def get_re(self):
            return re
        def get_hello(self):
            return hello

    return MyModule('wat')

sys.modules[__name__] = whyDoesThisWorkIDontEven()

但我绝对不知道为什么。

答案 1 :(得分:1)

不确定你的意思是“与进口效果不佳”,因为这似乎也有效。不确定那是你想要的,但也许它很有用......

    import sys
    import re
    class _Test(object):
      def __init__(self):
          self.re=re
      def testfunc(self):
          return self.re
      y = property(testfunc)
    sys.modules[__name__] = _Test()

import calltest

>>> calltest.y
<module 're' from 'C:\Python26\lib\re.pyc'>
>>> calltest.re
<module 're' from 'C:\Python26\lib\re.pyc'>
>>> calltest.testfunc()
<module 're' from 'C:\Python26\lib\re.pyc'>

编辑:

如果您只是尝试return re,您将获得None。您必须在执行

后导入re
sys.modules[__name__] = _Test()

像:

sys.modules[__name__] = _Test()
import re

然后简单地调用re woudld工作。

答案 2 :(得分:1)

它不起作用,因为您在sys.modules中重新分配其条目时有效删除了模块。请参阅我的相关question

要使其正常工作,请将模块的最后一行更改为:

_ref, sys.modules[__name__] = sys.modules[__name__], MyModule('wat')

它会起作用。

顺便说一句,您不必从types.ModuleType派生您的课程,以便将其实例放入sys.modules[]sys.modules中的条目不必是模块对象(根据Alex Martelli)。