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?

1
Eric 8 Okt. 2012 im 12:45

3 Antworten

Beste Antwort

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

1
Community 23 Mai 2017 im 12:12

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.

1
root 8 Okt. 2012 im 09:58

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.

1
Eric 8 Okt. 2012 im 09:06