Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python pickle上的名称空间_Python_Namespaces_Pickle - Fatal编程技术网

python pickle上的名称空间

python pickle上的名称空间,python,namespaces,pickle,Python,Namespaces,Pickle,我将pickle与unittest一起使用时出错 我写了3个程序文件: 对于一个需要腌制的班级 对于使用#1中的类的类 单元测试用于测试#2中的类 实际代码分别如下所示 #一,。ClassToPickle.py import pickle class ClassToPickle(object): def __init__(self, x): self.x = x if __name__=="__main__": p = ClassToPickle(10)

我将pickle与unittest一起使用时出错

我写了3个程序文件:

  • 对于一个需要腌制的班级
  • 对于使用#1中的类的类
  • 单元测试用于测试#2中的类
  • 实际代码分别如下所示

    #一,。ClassToPickle.py

    import pickle
    class ClassToPickle(object):
        def __init__(self, x):
            self.x = x
    if __name__=="__main__":
        p = ClassToPickle(10)
        pickle.dump(p, open('10.pickle', 'w'))
    
    #二,。某个班级

    from ClassToPickle import ClassToPickle
    import pickle
    
    class SomeClass(object):
        def __init__(self):
            self.pickle = pickle.load(open("10.pickle", 'r'))
            self.x = self.pickle.x
            print self.x
    
    if __name__ == "__main__":
        SomeClass()
    
    #三,。SomeClassTest.py

    import unittest
    from SomeClass import SomeClass
    from ClassToPickle import ClassToPickle # REQUIRED_LINE
    
    class SomeClassTest(unittest.TestCase):
        def testA(self):
            sc = SomeClass()
            self.assertEqual(sc.x, 10)
    
    def main():
        unittest.main()
    
    if __name__ == "__main__":
        main()
    
    我首先运行了#1程序来制作pickle文件。
    然后,当我单独运行程序文件#2(即输入“pythonsomeclass.py”)时,它就会工作。
    而且,当我单独运行程序3(即输入“pythonsomeclasstest.py”)时,它也可以工作。

    然而,当我在eclipse+pydev中以“单元测试”的形式运行程序#3时,它会返回下面的错误消息

    ==================================================================================
    错误:testA(SomeClassTest.SomeClassTest)
    ----------------------------------------------------------------------
    回溯(最近的上次调用):
    $File “/home/tmp/pickle_problem/SomeClassTest.py”,第9行,在 种皮
    sc=SomeClass()
    $File“/home/tmp/pickle\u problem/SomeClass.py”,第8行,在 init
    self.pickle=pickle.load(打开(“10.pickle”,“r”))
    $File“/usr/lib/python2.7/pickle.py”,第1378行,在load中
    返回load中的第858行Unpickler(file.load()
    $file”/usr/lib/python2.7/pickle.py dispatchkey
    文件/usr/lib/python2.7/pickle.py”,第1090行,在load_global中
    klass=self.find_类(模块,名称)
    $File“/usr/lib/python2.7/pickle.py”,第1126行,在find_类中
    klass=getattr(mod,name)
    $AttributeError:“module”对象没有属性“ClassToPickle”

    ----------------------------------------------------------------------
    在0.002s中运行了1次测试

    失败(错误=1)

    而且,当我注释掉导入ClassToPickle类的一行(program#3中的第3行并注释为“REQUIRED#line”)时,它不起作用,并返回下面描述的错误消息

    E
    ==================================================================================
    错误:testA(main.SomeClassTest)
    ----------------------------------------------------------------------
    回溯(最近一次呼叫最后一次):
    testA中第9行的文件“SomeClassTest.py”
    sc=SomeClass()
    文件“/home/tmp/pickle\u problem/SomeClass.py”,第8行,在init
    self.pickle=pickle.load(打开(“10.pickle”,“r”))
    文件“/usr/lib/python2.7/pickle.py”,第1378行,装入
    返回Unpickler(file.load()
    文件“/usr/lib/python2.7/pickle.py”,第858行,装入
    dispatchkey
    文件“/usr/lib/python2.7/pickle.py”,第1090行,在load_global中
    klass=self.find_类(模块,名称)
    文件“/usr/lib/python2.7/pickle.py”,第1126行,在find_类中
    klass=getattr(mod,name)
    AttributeError:“模块”对象没有属性“ClassToPickle”

    ----------------------------------------------------------------------
    在0.001s内运行1次测试

    失败(错误=1)

    我想问题是关于python中的名称空间,但我不知道到底发生了什么,我能做些什么来解决它

    我如何才能“作为单元测试运行(在eclipse+pydev中)”#3程序正确运行,
    并在命令行中运行#3程序,而不使用导入ClassToPickle的行?

    请帮帮我。

    那是因为
    \uuu main\uuuu.ClassToPickle!=ClassToPickle.ClassToPickle
    ,请这样想:

    当您在
    ClassToPickle.py
    脚本中pickle ClassToPickle的类实例时,pickle模块将pickle对该类的所有引用,这意味着它将pickle定义该类的模块名称,因为您执行了脚本
    ClassToPickle.py
    ,这意味着模块将被设置为
    \uuuuuu main\uuuuu
    ,这意味着
    pickle
    模块将pickle
    \uuuuuu main\uuuuuuuuu.ClassToPickle

    当您尝试加载pickle实例时,它失败了,因为它没有找到实例的类,该类是
    \uuuu main\uuuuu.ClassToPickle
    ,而不是您使用
    从ClassToPickle import ClassToPickle
    导入的类,因为最新的类是
    ClassToPickle.ClassToPickle

    解决方法是创建另一个脚本来处理转储,而不是在
    ClassToPickle.py
    中执行

    import pickle
    
    from ClassToPickle import ClassToPickle
    
    if __name__=="__main__":
        p = ClassToPickle(10)
        pickle.dump(p, open('10.pickle', 'w'))
    

    是否有另一个
    ClassToPickle.py
    文件可以找到,而不是您在此处显示的文件?@ThomasK谢谢您的评论,但答案是否定的。目录中只显示了三个.py文件,我从未创建名为
    ClassToPickle.py
    的文件。谢谢您的解释!这一切对我来说都很有意义,而且您的脚本在控制台和eclipse中都可以运行:)@fbessho:很高兴它很有用:)