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と、 が得られますNone。インポートre後にインポートする必要があります

sys.modules[__name__] = _Test()

お気に入り:

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

その後、 re を呼び出すだけで機能します。

于 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 に答える