def freezify(cls, frameCount=1): """Returns a 'frozen' namedtuple type of the given SlotCompare subclass.""" assert issubclass(cls, SlotCompare) frozenName = 'Frozen' + cls.__name__ # namedtuple constructs the base class. baseType = namedtuple(frozenName, cls.__slots__) # Subclass the namedtuple to add a thaw() mixin and to copy read-only # versions of the thawed class' properties. frozenDict = {'__slots__': (), '_thawedType': cls} for name, value in inspect.getmembers(cls): if isinstance(value, property): frozenDict[name] = property(value.fget) frozenType = type(frozenName, (baseType, _Thawable), frozenDict) # Stash forward and backward type references. cls._frozenType = frozenType frozenType._thawedType = cls # Frozen types are always safe to unpickle. module = sys._getframe(frameCount).f_globals.get('__name__', '__main__') frozenType.__module__ = module chutney.register(frozenType, _force=True) return frozenType
assigned = len(worker.tasks) available = worker.slots.get(self.slotType, 2) free = max(available - assigned, 0) if free: return core_const.A_NOW, free else: return core_const.A_LATER, None ## Freezer machinery def getData(self): return self.job.data.getObject() def setData(self, obj): if not isinstance(obj, rmk_types.FrozenObject): obj = rmk_types.FrozenObject.fromObject(obj) self.job.data = obj TaskCallbacks = namedtuple('TaskCallbacks', 'deferred callbacks') try: BaseException except NameError: BaseException = Exception class TasksFailed(BaseException): pass