自分でコメントすると、モジュール自体の「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