Author: Ronan Lamy <ronan.l...@gmail.com> Branch: Changeset: r74318:ffce4c795283 Date: 2014-10-31 21:39 +0000 http://bitbucket.org/pypy/pypy/changeset/ffce4c795283/
Log: Extract is_mixin() function diff --git a/rpython/annotator/description.py b/rpython/annotator/description.py --- a/rpython/annotator/description.py +++ b/rpython/annotator/description.py @@ -388,6 +388,9 @@ return s_sigs +def is_mixin(cls): + return cls.__dict__.get('_mixin_', False) + NODEFAULT = object() class ClassDesc(Desc): @@ -414,14 +417,13 @@ self.specialize = specialize self._classdefs = {} - assert cls.__module__ != '__builtin__' - base = object - baselist = list(cls.__bases__) - - if cls.__dict__.get('_mixin_', False): + if is_mixin(cls): raise AnnotatorError("cannot use directly the class %r because " "it is a _mixin_" % (cls,)) + assert cls.__module__ != '__builtin__' + baselist = list(cls.__bases__) + # special case: skip BaseException, and pretend # that all exceptions ultimately inherit from Exception instead # of BaseException (XXX hack) @@ -432,10 +434,11 @@ mixins_before = [] mixins_after = [] + base = object for b1 in baselist: if b1 is object: continue - if b1.__dict__.get('_mixin_', False): + if is_mixin(b1): if base is object: mixins_before.append(b1) else: @@ -539,7 +542,7 @@ add(check_not_in) # for base in reversed(mro): - assert base.__dict__.get("_mixin_", False), ( + assert is_mixin(base), ( "Mixin class %r has non mixin base class %r" % (mixins, base)) for name, value in base.__dict__.items(): if name in skip: diff --git a/rpython/annotator/test/test_description.py b/rpython/annotator/test/test_description.py --- a/rpython/annotator/test/test_description.py +++ b/rpython/annotator/test/test_description.py @@ -1,4 +1,4 @@ -from rpython.annotator.description import ClassDesc +from rpython.annotator.description import ClassDesc, is_mixin class FakeBookkeeper: def __init__(self): @@ -20,3 +20,13 @@ dC = bk.getdesc(C) dD = bk.getdesc(D) assert ClassDesc.getcommonbase([dC, dD]) is dA + +def test_is_mixin(): + class Mixin1(object): + _mixin_ = True + + class A(Mixin1): + pass + + assert is_mixin(Mixin1) + assert not is_mixin(A) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit