test_descr.py
来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Python 代码 · 共 2,316 行 · 第 1/5 页
PY
2,316 行
def dmethod(self): return "D a" def all_method(self): return "D b" class M2(object, D): def m2method(self): return "M2 a" def all_method(self): return "M2 b" vereq(M2.__mro__, (M2, object, D, C)) m = M2() vereq(m.cmethod(), "C a") vereq(m.dmethod(), "D a") vereq(m.m2method(), "M2 a") vereq(m.all_method(), "M2 b") class M3(M1, object, M2): def m3method(self): return "M3 a" def all_method(self): return "M3 b" # XXX Expected this (the commented-out result): # vereq(M3.__mro__, (M3, M1, M2, object, D, C)) vereq(M3.__mro__, (M3, M1, M2, D, C, object)) # XXX ? m = M3() vereq(m.cmethod(), "C a") vereq(m.dmethod(), "D a") vereq(m.m1method(), "M1 a") vereq(m.m2method(), "M2 a") vereq(m.m3method(), "M3 a") vereq(m.all_method(), "M3 b") class Classic: pass try: class New(Classic): __metaclass__ = type except TypeError: pass else: raise TestFailed, "new class with only classic bases - shouldn't be"def diamond(): if verbose: print "Testing multiple inheritance special cases..." class A(object): def spam(self): return "A" vereq(A().spam(), "A") class B(A): def boo(self): return "B" def spam(self): return "B" vereq(B().spam(), "B") vereq(B().boo(), "B") class C(A): def boo(self): return "C" vereq(C().spam(), "A") vereq(C().boo(), "C") class D(B, C): pass vereq(D().spam(), "B") vereq(D().boo(), "B") vereq(D.__mro__, (D, B, C, A, object)) class E(C, B): pass vereq(E().spam(), "B") vereq(E().boo(), "C") vereq(E.__mro__, (E, C, B, A, object)) class F(D, E): pass vereq(F().spam(), "B") vereq(F().boo(), "B") vereq(F.__mro__, (F, D, E, B, C, A, object)) class G(E, D): pass vereq(G().spam(), "B") vereq(G().boo(), "C") vereq(G.__mro__, (G, E, D, C, B, A, object))def objects(): if verbose: print "Testing object class..." a = object() vereq(a.__class__, object) vereq(type(a), object) b = object() verify(a is not b) verify(not hasattr(a, "foo")) try: a.foo = 12 except (AttributeError, TypeError): pass else: verify(0, "object() should not allow setting a foo attribute") verify(not hasattr(object(), "__dict__")) class Cdict(object): pass x = Cdict() vereq(x.__dict__, {}) x.foo = 1 vereq(x.foo, 1) vereq(x.__dict__, {'foo': 1})def slots(): if verbose: print "Testing __slots__..." class C0(object): __slots__ = [] x = C0() verify(not hasattr(x, "__dict__")) verify(not hasattr(x, "foo")) class C1(object): __slots__ = ['a'] x = C1() verify(not hasattr(x, "__dict__")) verify(not hasattr(x, "a")) x.a = 1 vereq(x.a, 1) x.a = None veris(x.a, None) del x.a verify(not hasattr(x, "a")) class C3(object): __slots__ = ['a', 'b', 'c'] x = C3() verify(not hasattr(x, "__dict__")) verify(not hasattr(x, 'a')) verify(not hasattr(x, 'b')) verify(not hasattr(x, 'c')) x.a = 1 x.b = 2 x.c = 3 vereq(x.a, 1) vereq(x.b, 2) vereq(x.c, 3) # Test leaks class Counted(object): counter = 0 # counts the number of instances alive def __init__(self): Counted.counter += 1 def __del__(self): Counted.counter -= 1 class C(object): __slots__ = ['a', 'b', 'c'] x = C() x.a = Counted() x.b = Counted() x.c = Counted() vereq(Counted.counter, 3) del x vereq(Counted.counter, 0) class D(C): pass x = D() x.a = Counted() x.z = Counted() vereq(Counted.counter, 2) del x vereq(Counted.counter, 0) class E(D): __slots__ = ['e'] x = E() x.a = Counted() x.z = Counted() x.e = Counted() vereq(Counted.counter, 3) del x vereq(Counted.counter, 0) # Test cyclical leaks [SF bug 519621] class F(object): __slots__ = ['a', 'b'] log = [] s = F() s.a = [Counted(), s] vereq(Counted.counter, 1) s = None import gc gc.collect() vereq(Counted.counter, 0) # Test lookup leaks [SF bug 572567] import sys,gc class G(object): def __cmp__(self, other): return 0 g = G() orig_objects = len(gc.get_objects()) for i in xrange(10): g==g new_objects = len(gc.get_objects()) vereq(orig_objects, new_objects)def dynamics(): if verbose: print "Testing class attribute propagation..." class D(object): pass class E(D): pass class F(D): pass D.foo = 1 vereq(D.foo, 1) # Test that dynamic attributes are inherited vereq(E.foo, 1) vereq(F.foo, 1) # Test dynamic instances class C(object): pass a = C() verify(not hasattr(a, "foobar")) C.foobar = 2 vereq(a.foobar, 2) C.method = lambda self: 42 vereq(a.method(), 42) C.__repr__ = lambda self: "C()" vereq(repr(a), "C()") C.__int__ = lambda self: 100 vereq(int(a), 100) vereq(a.foobar, 2) verify(not hasattr(a, "spam")) def mygetattr(self, name): if name == "spam": return "spam" raise AttributeError C.__getattr__ = mygetattr vereq(a.spam, "spam") a.new = 12 vereq(a.new, 12) def mysetattr(self, name, value): if name == "spam": raise AttributeError return object.__setattr__(self, name, value) C.__setattr__ = mysetattr try: a.spam = "not spam" except AttributeError: pass else: verify(0, "expected AttributeError") vereq(a.spam, "spam") class D(C): pass d = D() d.foo = 1 vereq(d.foo, 1) # Test handling of int*seq and seq*int class I(int): pass vereq("a"*I(2), "aa") vereq(I(2)*"a", "aa") vereq(2*I(3), 6) vereq(I(3)*2, 6) vereq(I(3)*I(2), 6) # Test handling of long*seq and seq*long class L(long): pass vereq("a"*L(2L), "aa") vereq(L(2L)*"a", "aa") vereq(2*L(3), 6) vereq(L(3)*2, 6) vereq(L(3)*L(2), 6) # Test comparison of classes with dynamic metaclasses class dynamicmetaclass(type): pass class someclass: __metaclass__ = dynamicmetaclass verify(someclass != object)def errors(): if verbose: print "Testing errors..." try: class C(list, dict): pass except TypeError: pass else: verify(0, "inheritance from both list and dict should be illegal") try: class C(object, None): pass except TypeError: pass else: verify(0, "inheritance from non-type should be illegal") class Classic: pass try: class C(type(len)): pass except TypeError: pass else: verify(0, "inheritance from CFunction should be illegal") try: class C(object): __slots__ = 1 except TypeError: pass else: verify(0, "__slots__ = 1 should be illegal") try: class C(object): __slots__ = [1] except TypeError: pass else: verify(0, "__slots__ = [1] should be illegal")def classmethods(): if verbose: print "Testing class methods..." class C(object): def foo(*a): return a goo = classmethod(foo) c = C() vereq(C.goo(1), (C, 1)) vereq(c.goo(1), (C, 1)) vereq(c.foo(1), (c, 1)) class D(C): pass d = D() vereq(D.goo(1), (D, 1)) vereq(d.goo(1), (D, 1)) vereq(d.foo(1), (d, 1)) vereq(D.foo(d, 1), (d, 1)) # Test for a specific crash (SF bug 528132) def f(cls, arg): return (cls, arg) ff = classmethod(f) vereq(ff.__get__(0, int)(42), (int, 42)) vereq(ff.__get__(0)(42), (int, 42)) # Test super() with classmethods (SF bug 535444) veris(C.goo.im_self, C) veris(D.goo.im_self, D) veris(super(D,D).goo.im_self, D) veris(super(D,d).goo.im_self, D) vereq(super(D,D).goo(), (D,)) vereq(super(D,d).goo(), (D,))def staticmethods(): if verbose: print "Testing static methods..." class C(object): def foo(*a): return a goo = staticmethod(foo) c = C() vereq(C.goo(1), (1,)) vereq(c.goo(1), (1,)) vereq(c.foo(1), (c, 1,)) class D(C): pass d = D() vereq(D.goo(1), (1,)) vereq(d.goo(1), (1,)) vereq(d.foo(1), (d, 1)) vereq(D.foo(d, 1), (d, 1))def classic(): if verbose: print "Testing classic classes..." class C: def foo(*a): return a goo = classmethod(foo) c = C() vereq(C.goo(1), (C, 1)) vereq(c.goo(1), (C, 1)) vereq(c.foo(1), (c, 1)) class D(C): pass d = D() vereq(D.goo(1), (D, 1)) vereq(d.goo(1), (D, 1)) vereq(d.foo(1), (d, 1)) vereq(D.foo(d, 1), (d, 1)) class E: # *not* subclassing from C foo = C.foo vereq(E().foo, C.foo) # i.e., unbound verify(repr(C.foo.__get__(C())).startswith("<bound method "))def compattr(): if verbose: print "Testing computed attributes..." class C(object): class computed_attribute(object): def __init__(self, get, set=None, delete=None): self.__get = get self.__set = set self.__delete = delete def __get__(self, obj, type=None): return self.__get(obj) def __set__(self, obj, value): return self.__set(obj, value) def __delete__(self, obj): return self.__delete(obj) def __init__(self): self.__x = 0 def __get_x(self): x = self.__x self.__x = x+1 return x def __set_x(self, x): self.__x = x def __delete_x(self): del self.__x x = computed_attribute(__get_x, __set_x, __delete_x) a = C() vereq(a.x, 0) vereq(a.x, 1) a.x = 10 vereq(a.x, 10) vereq(a.x, 11) del a.x vereq(hasattr(a, 'x'), 0)def newslot(): if verbose: print "Testing __new__ slot override..." class C(list): def __new__(cls): self = list.__new__(cls) self.foo = 1 return self def __init__(self): self.foo = self.foo + 2 a = C() vereq(a.foo, 3) verify(a.__class__ is C) class D(C): pass b = D() vereq(b.foo, 3) verify(b.__class__ is D)def altmro(): if verbose: print "Testing mro() and overriding it..." class A(object): def f(self): return "A" class B(A): pass class C(A): def f(self): return "C" class D(B, C): pass vereq(D.mro(), [D, B, C, A, object]) vereq(D.__mro__, (D, B, C, A, object)) vereq(D().f(), "C") class PerverseMetaType(type): def mro(cls): L = type.mro(cls) L.reverse() return L class X(A,B,C,D): __metaclass__ = PerverseMetaType vereq(X.__mro__, (object, A, C, B, D, X)) vereq(X().f(), "A")def overloading(): if verbose: print "Testing operator overloading..." class B(object): "Intermediate class because object doesn't have a __setattr__"
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?