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

当您自己评论时-可能某些代码将 None 归因于模块本身的“cim”名称-检查此问题的方法是,您的大型模块是否将对其他模块设置为“只读”-我认为Python 允许这样做——

(20 分钟。黑客)——

在这里——只要把这个片段放在一个“protect_module.py”文件中,导入它,然后在你的模块末尾调用“ProtectdedModule()”,其中名称“cim”正在消失——它应该给你罪魁祸首:

"""
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 回答