首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >python泡菜上的命名空间

python泡菜上的命名空间
EN

Stack Overflow用户
提问于 2011-10-28 11:12:30
回答 1查看 2.5K关注 0票数 7

当我用泡菜和单品一起使用时,我犯了一个错误。

我写了3个程序文件:

  1. 表示要腌制的类,
  2. 用于使用#1中类的类,
  3. 单元测试用于测试类2.

实码分别如下。

#1. ClassToPickle.py

代码语言:javascript
代码运行次数:0
运行
复制
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'))

#2. SomeClass.py

代码语言:javascript
代码运行次数:0
运行
复制
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()

#3. SomeClassTest.py

代码语言:javascript
代码运行次数:0
运行
复制
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程序来制作泡菜文件。

然后,当我单独运行程序文件#2 (即输入"python SomeClass.py")时,它就能工作了。

而且,当我单独运行程序#3 (即输入"python SomeClassTest.py")时,它也能工作。

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

======================================================================

错误: testA (SomeClassTest.SomeClassTest)跟踪(最近一次调用):

$ File“/home/tmp/泡菜问题/SomeClassTest.py”,第9行,在testA中

sc = SomeClass()

$ File“/home/tmp/泡菜问题/SomeClass.py”,第8行,在init

self.pickle =pickle.load(打开(“10.泡菜”,'r'))

$ File“/usr/lib/python2.7/泡菜. in”,第1378行,加载

返回Unpickler(文件).load()

$ File“/usr/lib/python2.7/泡菜. in”,第858行,装载

调度员

文件“/usr/lib/python2.7/泡菜. in”,第1090行,在load_global中

klass =self.find_class(模块,名称)

$ File“/usr/lib/python2.7/泡菜. in”,第1126行,find_class

klass = getattr(mod,name)

$ AttributeError:‘模块’对象没有属性'ClassToPickle‘在0.002 s失败(errors=1)中运行1测试

而且,当我注释掉导入ClassToPickle类的一行(程序#3中的第3行,并注释为"REQUIRED_LINE")时,它无法工作,并返回下面描述的错误消息。

E

======================================================================

错误:(main.SomeClassTest)跟踪(最近一次调用):

文件"SomeClassTest.py",第9行,testA

sc = SomeClass()

init中的“/home/tmp/泡菜问题/SomeClass.py”文件,第8行

self.pickle =pickle.load(打开(“10.泡菜”,'r'))

文件“/usr/lib/python2.7/泡菜. in”,第1378行,加载

返回Unpickler(文件).load()

文件“/usr/lib/python2.7/泡菜. in”,第858行,装载

调度员

文件“/usr/lib/python2.7/泡菜. in”,第1090行,在load_global中

klass =self.find_class(模块,名称)

文件“/usr/lib/python2.7/泡菜. in”,第1126行,在find_class中

klass = getattr(mod,name)

AttributeError:‘模块’对象没有属性'ClassToPickle‘在0.001s失败(errors=1)中运行1测试

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

我如何“以单元测试(在eclipse+pydev中)运行”#3程序正确,

并在没有导入ClassToPickle的行的命令行中运行#3程序?

请帮帮我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-28 12:00:41

因为__main__.ClassToPickle != ClassToPickle.ClassToPickle,把它想成这样:

当您在ClassToPickle脚本中对类实例进行腌制时,泡菜模块将对类的所有引用进行筛选,这意味着它将对定义类的模块名进行筛选,而且由于您执行了脚本ClassToPickle.py,这意味着模块将被设置为__main__,这意味着pickle模块将对__main__.ClassToPickle进行筛选。

当您试图加载已被腌制的实例时,它失败了,因为它没有找到实例的类,即__main__.ClassToPickle,而不是使用from ClassToPickle import ClassToPickle导入的类,因为最新的是ClassToPickle.ClassToPickle

修复方法是创建另一个处理转储的脚本,而不是在ClassToPickle.py中执行。

代码语言:javascript
代码运行次数:0
运行
复制
import pickle

from ClassToPickle import ClassToPickle

if __name__=="__main__":
    p = ClassToPickle(10)
    pickle.dump(p, open('10.pickle', 'w'))
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7928450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档