Ich habe dieses Modul, 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')
Und ich führe diesen Code aus:
>>> import wat
>>> wat.get_hello()
None
>>> wat.get_re()
None
Warum funktioniert das nicht?
3 Antworten
Es funktioniert nicht, weil Sie Ihr Modul effektiv gelöscht haben, als Sie seinen Eintrag in sys.modules
neu zugewiesen haben. Siehe meine verwandte Frage.
Ändern Sie die letzte Zeile Ihres Moduls in:
_ref, sys.modules[__name__] = sys.modules[__name__], MyModule('wat')
Und es wird funktionieren.
Übrigens müssen Sie Ihre Klasse nicht von types.ModuleType
ableiten, um Instanzen davon in sys.modules[]
zu platzieren. Einträge in sys.modules
müssen keine Modulobjekte sein (laut > Alex Martelli).
Ich bin mir nicht sicher, was Sie unter "spielt nicht gut mit Importen" verstehen, da dies auch zu funktionieren scheint. Ich bin mir nicht sicher, ob du das willst, aber vielleicht ist es nützlich ...
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'>
BEARBEITEN:
Wenn Sie einfach versuchen, return re
, erhalten Sie None
. Sie müssen danach re
importieren
sys.modules[__name__] = _Test()
Mögen:
sys.modules[__name__] = _Test()
import re
Dann einfach re woudld work anrufen.
Mit diesem Code funktioniert es:
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()
Aber ich habe absolut keine Ahnung warum.
Verwandte Fragen
Verknüpfte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.