Python / Nose / Testing为什么腌制OrderedDict会失败?

时间:2014-07-09 08:43:54

标签: google-app-engine python-2.7 nose nosetests

我在GAE的一次鼻子测试中发现了一些非常奇怪的行为,不太确定如何进一步调试它...任何想法为什么失败都会被赞赏...

# Main Testing file stripped to the basics
# -*- coding: utf-8 -*-
import unittest
import pickle

from collections import OrderedDict
from ptest import SomeClass


class PickleTest(unittest.TestCase):
    def runTest(self):
        res = OrderedDict()

        for item in [1, 2, 3]:
            res[item] = "test"

        #works
        pickle.dumps(res)

        #fails
        otherClass = SomeClass()
        test = otherClass.pTest("Nav")

if __name__ == '__main__':
        unittest.main()

导入的类文件:

import pickle

from collections import OrderedDict

class SomeClass:
    def pTest(self, tableName=None, rightsTrimmed=True):
        return pickle.dumps(OrderedDict())

导致

PicklingError: Can't pickle <class 'collections.OrderedDict'>: it's not the same object as collections.OrderedDict

但奇怪的是,只有导入类中的语句,而不是主要语句。

我的智慧结束了。在正常的GAE开发/生产环境中执行,代码可以工作......系统Python版本是Python 2.7.5。

1 个答案:

答案 0 :(得分:0)

感谢Oleksiy,我发现在插入断点时,测试运行但没有修改代码。施坦格。我无法想象为什么,但这让我觉得在时间方面真的很奇怪。并且,为了证实这种怀疑,我尝试过延迟导入OrderedDict,这是有效的。

这是第一次发现,将我的生产代码更改为后期导入以允许测试运行似乎很疯狂。我会读到迟到的进口情况并考虑如何继续......

# -*- coding: utf-8 -*-
import pickle

#from collections import OrderedDict

class SomeClass:
    def pTest(self, tableName=None, rightTrimmed=True):
        # The Demons seem to be pleased by the late import...
        from collections import OrderedDict
        return pickle.dumps(OrderedDict())