1

我有这个模块,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

为什么这不起作用?

4

3 回答 3

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()

但我完全不知道为什么。

于 2012-10-08T09:06:01.223 回答
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你会得到Nonere完成后必须导入

sys.modules[__name__] = _Test()

像:

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

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

于 2012-10-08T09:21:09.980 回答
1

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

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

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

它会起作用。

顺便说一句,您不必types.ModuleType为了将它的实例放入sys.modules[]. 中的条目sys.modules不必是模块对象(根据Alex Martelli)。

于 2012-10-08T16:42:06.303 回答