6

正常にインポートするモジュールがあります(それを使用するモジュールの上部に印刷します)

from authorize import cim
print cim

生成するもの:

<module 'authorize.cim' from '.../dist-packages/authorize/cim.pyc'>

しかし、後でメソッド呼び出しで、それは不思議なことにになりましたNone

class MyClass(object):
    def download(self):
        print cim

ショーを実行すると、それcimNoneです。Noneモジュールがこのモジュールのどこにも直接割り当てられることはありません。

これがどのように起こり得るかについてのアイデアはありますか?

4

2 に答える 2

4

自分でコメントすると、モジュール自体の「cim」名にNoneが原因である可能性があります。これを確認する方法は、大きなモジュールが他のモジュールに対して「読み取り専用」になるかどうかです。 Pythonはこれを可能にします-

(20分ハッキング)-

ここでは、このスニペットを「protect_module.py」ファイルに入れてインポ​​ートし、「cim」という名前が消えているモジュールの最後で「ProtectdedModule()」を呼び出します。これにより、原因がわかります。

"""
Protects a Module against naive monkey patching  -
may be usefull for debugging large projects where global
variables change without notice.

Just call the "ProtectedModule"  class, with no parameters from the end of 
the module definition you want to protect, and subsequent assignments to it
should fail.

"""

from types import ModuleType
from inspect import currentframe, getmodule
import sys

class ProtectedModule(ModuleType):
    def __init__(self, module=None):
        if module is None:
            module = getmodule(currentframe(1))
        ModuleType.__init__(self, module.__name__, module.__doc__)
        self.__dict__.update(module.__dict__)
        sys.modules[self.__name__] = self

    def __setattr__(self, attr, value):
        frame = currentframe(1)
        raise ValueError("Attempt to monkey patch module %s from %s, line %d" % 
            (self.__name__, frame.f_code.co_filename, frame.f_lineno))        

if __name__ == "__main__":
    from xml.etree import ElementTree as ET
    ET = ProtectedModule(ET)
    print dir(ET)
    ET.bla = 10
    print ET.bla
于 2012-11-07T20:54:54.807 に答える
0

私の場合、これはスレッドの癖に関連していました:https ://docs.python.org/2/library/threading.html#importing-in-threaded-code

于 2016-04-22T07:34:27.030 に答える