pickletester.py

来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Python 代码 · 共 286 行

PY
286
字号
import unittestfrom test_support import TestFailed, have_unicodeclass C:    def __cmp__(self, other):        return cmp(self.__dict__, other.__dict__)import __main____main__.C = CC.__module__ = "__main__"class myint(int):    def __init__(self, x):        self.str = str(x)class initarg(C):    __safe_for_unpickling__ = 1    def __init__(self, a, b):        self.a = a        self.b = b    def __getinitargs__(self):        return self.a, self.bclass metaclass(type):    passclass use_metaclass(object):    __metaclass__ = metaclass# break into multiple strings to avoid confusing font-lock-modeDATA = """(lp1I0aL1LaF2ac__builtin__complexp2""" + \"""(F3F0tRp3aI1aI-1aI255aI-255aI-256aI65535aI-65535aI-65536aI2147483647aI-2147483647aI-2147483648a""" + \"""(S'abc'p4g4""" + \"""(i__main__Cp5""" + \"""(dp6S'foo'p7I1sS'bar'p8I2sbg5tp9ag9aI5a."""BINDATA = ']q\x01(K\x00L1L\nG@\x00\x00\x00\x00\x00\x00\x00' + \          'c__builtin__\ncomplex\nq\x02(G@\x08\x00\x00\x00\x00\x00' + \          '\x00G\x00\x00\x00\x00\x00\x00\x00\x00tRq\x03K\x01J\xff\xff' + \          '\xff\xffK\xffJ\x01\xff\xff\xffJ\x00\xff\xff\xffM\xff\xff' + \          'J\x01\x00\xff\xffJ\x00\x00\xff\xffJ\xff\xff\xff\x7fJ\x01\x00' + \          '\x00\x80J\x00\x00\x00\x80(U\x03abcq\x04h\x04(c__main__\n' + \          'C\nq\x05oq\x06}q\x07(U\x03fooq\x08K\x01U\x03barq\tK\x02ubh' + \          '\x06tq\nh\nK\x05e.'def create_data():    c = C()    c.foo = 1    c.bar = 2    x = [0, 1L, 2.0, 3.0+0j]    # Append some integer test cases at cPickle.c's internal size    # cutoffs.    uint1max = 0xff    uint2max = 0xffff    int4max = 0x7fffffff    x.extend([1, -1,              uint1max, -uint1max, -uint1max-1,              uint2max, -uint2max, -uint2max-1,               int4max,  -int4max,  -int4max-1])    y = ('abc', 'abc', c, c)    x.append(y)    x.append(y)    x.append(5)    return xclass AbstractPickleTests(unittest.TestCase):    _testdata = create_data()    def setUp(self):        # subclass must define self.dumps, self.loads, self.error        pass    def test_misc(self):        # test various datatypes not tested by testdata        x = myint(4)        s = self.dumps(x)        y = self.loads(s)        self.assertEqual(x, y)        x = (1, ())        s = self.dumps(x)        y = self.loads(s)        self.assertEqual(x, y)        x = initarg(1, x)        s = self.dumps(x)        y = self.loads(s)        self.assertEqual(x, y)        # XXX test __reduce__ protocol?    def test_identity(self):        s = self.dumps(self._testdata)        x = self.loads(s)        self.assertEqual(x, self._testdata)    def test_constant(self):        x = self.loads(DATA)        self.assertEqual(x, self._testdata)        x = self.loads(BINDATA)        self.assertEqual(x, self._testdata)    def test_binary(self):        s = self.dumps(self._testdata, 1)        x = self.loads(s)        self.assertEqual(x, self._testdata)    def test_recursive_list(self):        l = []        l.append(l)        s = self.dumps(l)        x = self.loads(s)        self.assertEqual(x, l)        self.assertEqual(x, x[0])        self.assertEqual(id(x), id(x[0]))    def test_recursive_dict(self):        d = {}        d[1] = d        s = self.dumps(d)        x = self.loads(s)        self.assertEqual(x, d)        self.assertEqual(x[1], x)        self.assertEqual(id(x[1]), id(x))    def test_recursive_inst(self):        i = C()        i.attr = i        s = self.dumps(i)        x = self.loads(s)        self.assertEqual(x, i)        self.assertEqual(x.attr, x)        self.assertEqual(id(x.attr), id(x))    def test_recursive_multi(self):        l = []        d = {1:l}        i = C()        i.attr = d        l.append(i)        s = self.dumps(l)        x = self.loads(s)        self.assertEqual(x, l)        self.assertEqual(x[0], i)        self.assertEqual(x[0].attr, d)        self.assertEqual(x[0].attr[1], x)        self.assertEqual(x[0].attr[1][0], i)        self.assertEqual(x[0].attr[1][0].attr, d)    def test_garyp(self):        self.assertRaises(self.error, self.loads, 'garyp')    def test_insecure_strings(self):        insecure = ["abc", "2 + 2", # not quoted                    "'abc' + 'def'", # not a single quoted string                    "'abc", # quote is not closed                    "'abc\"", # open quote and close quote don't match                    "'abc'   ?", # junk after close quote                    # some tests of the quoting rules                    "'abc\"\''",                    "'\\\\a\'\'\'\\\'\\\\\''",                    ]        for s in insecure:            buf = "S" + s + "\012p0\012."            self.assertRaises(ValueError, self.loads, buf)    if have_unicode:        def test_unicode(self):            endcases = [unicode(''), unicode('<\\u>'), unicode('<\\\u1234>'),                        unicode('<\n>'),  unicode('<\\>')]            for u in endcases:                p = self.dumps(u)                u2 = self.loads(p)                self.assertEqual(u2, u)    def test_ints(self):        import sys        n = sys.maxint        while n:            for expected in (-n, n):                s = self.dumps(expected)                n2 = self.loads(s)                self.assertEqual(expected, n2)            n = n >> 1    def test_maxint64(self):        maxint64 = (1L << 63) - 1        data = 'I' + str(maxint64) + '\n.'        got = self.loads(data)        self.assertEqual(got, maxint64)        # Try too with a bogus literal.        data = 'I' + str(maxint64) + 'JUNK\n.'        self.assertRaises(ValueError, self.loads, data)    def test_reduce(self):        pass    def test_getinitargs(self):        pass    def test_metaclass(self):        a = use_metaclass()        s = self.dumps(a)        b = self.loads(s)        self.assertEqual(a.__class__, b.__class__)    def test_structseq(self):        import time        t = time.localtime()        s = self.dumps(t)        u = self.loads(s)        self.assertEqual(t, u)        import os        if hasattr(os, "stat"):            t = os.stat(os.curdir)            s = self.dumps(t)            u = self.loads(s)            self.assertEqual(t, u)        if hasattr(os, "statvfs"):            t = os.statvfs(os.curdir)            s = self.dumps(t)            u = self.loads(s)            self.assertEqual(t, u)class AbstractPickleModuleTests(unittest.TestCase):    def test_dump_closed_file(self):        import tempfile, os        fn = tempfile.mktemp()        f = open(fn, "w")        f.close()        self.assertRaises(ValueError, self.module.dump, 123, f)        os.remove(fn)    def test_load_closed_file(self):        import tempfile, os        fn = tempfile.mktemp()        f = open(fn, "w")        f.close()        self.assertRaises(ValueError, self.module.dump, 123, f)        os.remove(fn)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?