我有这个模块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
为什么这不起作用?
答案 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)。