test_descr.py
来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Python 代码 · 共 2,316 行 · 第 1/5 页
PY
2,316 行
else: raise TestFailed, "NotImplemented should have caused TypeError"def longs(): if verbose: print "Testing long operations..." numops(100L, 3L)def floats(): if verbose: print "Testing float operations..." numops(100.0, 3.0)def complexes(): if verbose: print "Testing complex operations..." numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float']) class Number(complex): __slots__ = ['prec'] def __new__(cls, *args, **kwds): result = complex.__new__(cls, *args) result.prec = kwds.get('prec', 12) return result def __repr__(self): prec = self.prec if self.imag == 0.0: return "%.*g" % (prec, self.real) if self.real == 0.0: return "%.*gj" % (prec, self.imag) return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag) __str__ = __repr__ a = Number(3.14, prec=6) vereq(`a`, "3.14") vereq(a.prec, 6) a = Number(a, prec=2) vereq(`a`, "3.1") vereq(a.prec, 2) a = Number(234.5) vereq(`a`, "234.5") vereq(a.prec, 12)def spamlists(): if verbose: print "Testing spamlist operations..." import copy, xxsubtype as spam def spamlist(l, memo=None): import xxsubtype as spam return spam.spamlist(l) # This is an ugly hack: copy._deepcopy_dispatch[spam.spamlist] = spamlist testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__") testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__") testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__") testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__") testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]", "__getslice__") testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b", "__iadd__") testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__") testunop(spamlist([1,2,3]), 3, "len(a)", "__len__") testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__") testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__") testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__") testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]), spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__") # Test subclassing class C(spam.spamlist): def foo(self): return 1 a = C() vereq(a, []) vereq(a.foo(), 1) a.append(100) vereq(a, [100]) vereq(a.getstate(), 0) a.setstate(42) vereq(a.getstate(), 42)def spamdicts(): if verbose: print "Testing spamdict operations..." import copy, xxsubtype as spam def spamdict(d, memo=None): import xxsubtype as spam sd = spam.spamdict() for k, v in d.items(): sd[k] = v return sd # This is an ugly hack: copy._deepcopy_dispatch[spam.spamdict] = spamdict testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__") testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__") testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__") testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__") d = spamdict({1:2,3:4}) l1 = [] for i in d.keys(): l1.append(i) l = [] for i in iter(d): l.append(i) vereq(l, l1) l = [] for i in d.__iter__(): l.append(i) vereq(l, l1) l = [] for i in type(spamdict({})).__iter__(d): l.append(i) vereq(l, l1) straightd = {1:2, 3:4} spamd = spamdict(straightd) testunop(spamd, 2, "len(a)", "__len__") testunop(spamd, repr(straightd), "repr(a)", "__repr__") testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}), "a[b]=c", "__setitem__") # Test subclassing class C(spam.spamdict): def foo(self): return 1 a = C() vereq(a.items(), []) vereq(a.foo(), 1) a['foo'] = 'bar' vereq(a.items(), [('foo', 'bar')]) vereq(a.getstate(), 0) a.setstate(100) vereq(a.getstate(), 100)def pydicts(): if verbose: print "Testing Python subclass of dict..." verify(issubclass(dict, dict)) verify(isinstance({}, dict)) d = dict() vereq(d, {}) verify(d.__class__ is dict) verify(isinstance(d, dict)) class C(dict): state = -1 def __init__(self, *a, **kw): if a: vereq(len(a), 1) self.state = a[0] if kw: for k, v in kw.items(): self[v] = k def __getitem__(self, key): return self.get(key, 0) def __setitem__(self, key, value): verify(isinstance(key, type(0))) dict.__setitem__(self, key, value) def setstate(self, state): self.state = state def getstate(self): return self.state verify(issubclass(C, dict)) a1 = C(12) vereq(a1.state, 12) a2 = C(foo=1, bar=2) vereq(a2[1] == 'foo' and a2[2], 'bar') a = C() vereq(a.state, -1) vereq(a.getstate(), -1) a.setstate(0) vereq(a.state, 0) vereq(a.getstate(), 0) a.setstate(10) vereq(a.state, 10) vereq(a.getstate(), 10) vereq(a[42], 0) a[42] = 24 vereq(a[42], 24) if verbose: print "pydict stress test ..." N = 50 for i in range(N): a[i] = C() for j in range(N): a[i][j] = i*j for i in range(N): for j in range(N): vereq(a[i][j], i*j)def pylists(): if verbose: print "Testing Python subclass of list..." class C(list): def __getitem__(self, i): return list.__getitem__(self, i) + 100 def __getslice__(self, i, j): return (i, j) a = C() a.extend([0,1,2]) vereq(a[0], 100) vereq(a[1], 101) vereq(a[2], 102) vereq(a[100:200], (100,200))def metaclass(): if verbose: print "Testing __metaclass__..." class C: __metaclass__ = type def __init__(self): self.__state = 0 def getstate(self): return self.__state def setstate(self, state): self.__state = state a = C() vereq(a.getstate(), 0) a.setstate(10) vereq(a.getstate(), 10) class D: class __metaclass__(type): def myself(cls): return cls vereq(D.myself(), D) d = D() verify(d.__class__ is D) class M1(type): def __new__(cls, name, bases, dict): dict['__spam__'] = 1 return type.__new__(cls, name, bases, dict) class C: __metaclass__ = M1 vereq(C.__spam__, 1) c = C() vereq(c.__spam__, 1) class _instance(object): pass class M2(object): def __new__(cls, name, bases, dict): self = object.__new__(cls) self.name = name self.bases = bases self.dict = dict return self __new__ = staticmethod(__new__) def __call__(self): it = _instance() # Early binding of methods for key in self.dict: if key.startswith("__"): continue setattr(it, key, self.dict[key].__get__(it, self)) return it class C: __metaclass__ = M2 def spam(self): return 42 vereq(C.name, 'C') vereq(C.bases, ()) verify('spam' in C.dict) c = C() vereq(c.spam(), 42) # More metaclass examples class autosuper(type): # Automatically add __super to the class # This trick only works for dynamic classes def __new__(metaclass, name, bases, dict): cls = super(autosuper, metaclass).__new__(metaclass, name, bases, dict) # Name mangling for __super removes leading underscores while name[:1] == "_": name = name[1:] if name: name = "_%s__super" % name else: name = "__super" setattr(cls, name, super(cls)) return cls class A: __metaclass__ = autosuper def meth(self): return "A" class B(A): def meth(self): return "B" + self.__super.meth() class C(A): def meth(self): return "C" + self.__super.meth() class D(C, B): def meth(self): return "D" + self.__super.meth() vereq(D().meth(), "DCBA") class E(B, C): def meth(self): return "E" + self.__super.meth() vereq(E().meth(), "EBCA") class autoproperty(type): # Automatically create property attributes when methods # named _get_x and/or _set_x are found def __new__(metaclass, name, bases, dict): hits = {} for key, val in dict.iteritems(): if key.startswith("_get_"): key = key[5:] get, set = hits.get(key, (None, None)) get = val hits[key] = get, set elif key.startswith("_set_"): key = key[5:] get, set = hits.get(key, (None, None)) set = val hits[key] = get, set for key, (get, set) in hits.iteritems(): dict[key] = property(get, set) return super(autoproperty, metaclass).__new__(metaclass, name, bases, dict) class A: __metaclass__ = autoproperty def _get_x(self): return -self.__x def _set_x(self, x): self.__x = -x a = A() verify(not hasattr(a, "x")) a.x = 12 vereq(a.x, 12) vereq(a._A__x, -12) class multimetaclass(autoproperty, autosuper): # Merge of multiple cooperating metaclasses pass class A: __metaclass__ = multimetaclass def _get_x(self): return "A" class B(A): def _get_x(self): return "B" + self.__super._get_x() class C(A): def _get_x(self): return "C" + self.__super._get_x() class D(C, B): def _get_x(self): return "D" + self.__super._get_x() vereq(D().x, "DCBA") # Make sure type(x) doesn't call x.__class__.__init__ class T(type): counter = 0 def __init__(self, *args): T.counter += 1 class C: __metaclass__ = T vereq(T.counter, 1) a = C() vereq(type(a), C) vereq(T.counter, 1) class C(object): pass c = C() try: c() except TypeError: pass else: raise TestError, "calling object w/o call method should raise TypeError"def pymods(): if verbose: print "Testing Python subclass of module..." log = [] import sys MT = type(sys) class MM(MT): def __init__(self): MT.__init__(self) def __getattribute__(self, name): log.append(("getattr", name)) return MT.__getattribute__(self, name) def __setattr__(self, name, value): log.append(("setattr", name, value)) MT.__setattr__(self, name, value) def __delattr__(self, name): log.append(("delattr", name)) MT.__delattr__(self, name) a = MM() a.foo = 12 x = a.foo del a.foo vereq(log, [("setattr", "foo", 12), ("getattr", "foo"), ("delattr", "foo")])def multi(): if verbose: print "Testing multiple inheritance..." class C(object): def __init__(self): self.__state = 0 def getstate(self): return self.__state def setstate(self, state): self.__state = state a = C() vereq(a.getstate(), 0) a.setstate(10) vereq(a.getstate(), 10) class D(dict, C): def __init__(self): type({}).__init__(self) C.__init__(self) d = D() vereq(d.keys(), []) d["hello"] = "world" vereq(d.items(), [("hello", "world")]) vereq(d["hello"], "world") vereq(d.getstate(), 0) d.setstate(10) vereq(d.getstate(), 10) vereq(D.__mro__, (D, dict, C, object)) # SF bug #442833 class Node(object): def __int__(self): return int(self.foo()) def foo(self): return "23" class Frag(Node, list): def foo(self): return "42" vereq(Node().__int__(), 23) vereq(int(Node()), 23) vereq(Frag().__int__(), 42) vereq(int(Frag()), 42) # MI mixing classic and new-style classes. class A: x = 1 class B(A): pass class C(A): x = 2 class D(B, C): pass vereq(D.x, 1) # Classic MRO is preserved for a classic base class. class E(D, object): pass vereq(E.__mro__, (E, D, B, A, C, object)) vereq(E.x, 1) # But with a mix of classic bases, their MROs are combined using # new-style MRO. class F(B, C, object): pass vereq(F.__mro__, (F, B, C, A, object)) vereq(F.x, 2) # Try something else. class C: def cmethod(self): return "C a" def all_method(self): return "C b" class M1(C, object): def m1method(self): return "M1 a" def all_method(self): return "M1 b" vereq(M1.__mro__, (M1, C, object)) m = M1() vereq(m.cmethod(), "C a") vereq(m.m1method(), "M1 a") vereq(m.all_method(), "M1 b") class D(C):
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?