def __call__(self, f): """Return decorated version of f.""" from sage.misc.function_mangling import ArgumentFixer A = ArgumentFixer(f) def g(*args, **kwds): k = A.fix_to_named(*args, **kwds) try: return self.db[k] except KeyError: pass x = self.db[k] = f(*args, **kwds) self.db.commit() return x def keys(): return self.db.keys() g.keys = keys g.db = self.db return g
def __init__(self, inst, f, name=None, **options): r""" Initialize ``self``. TESTS:: sage: from sage.sets.set_from_iterator import DummyExampleForPicklingTest sage: d = DummyExampleForPicklingTest() sage: d.f() {10, 11, 12, 13, 14, ...} It is possible to pickle/unpickle the class and the instance:: sage: loads(dumps(DummyExampleForPicklingTest))().f() {10, 11, 12, 13, 14, ...} sage: loads(dumps(d)).f() {10, 11, 12, 13, 14, ...} But not the enumerated set:: sage: loads(dumps(d.f())) # py2 Traceback (most recent call last): ... PicklingError: Can't pickle <... 'function'>: attribute lookup __builtin__.function failed sage: loads(dumps(d.f())) # py3 Traceback (most recent call last): ... _pickle.PicklingError: Can't pickle <function DummyExampleForPicklingTest.f at ...>: it's not the same object as sage.sets.set_from_iterator.DummyExampleForPicklingTest.f """ self.inst = inst self.f = f self.af = ArgumentFixer(self.f) if hasattr(f, "__name__"): self.__name__ = f.__name__ else: self.__name__ = f.__name__ self.__module__ = f.__module__ self.name = name self.options = options
def __init__(self, f=None, name=None, **options): r""" Initialize ``self``. TESTS:: sage: from sage.sets.set_from_iterator import set_from_function sage: F = set_from_function(category=FiniteEnumeratedSets())(xsrange) sage: TestSuite(F(100)).run() sage: TestSuite(F(1,5,2)).run() sage: TestSuite(F(0)).run() """ if f is not None: self.f = f if hasattr(f, "__name__"): self.__name__ = f.__name__ else: self.__name__ = f.__name__ self.__module__ = f.__module__ self.af = ArgumentFixer(f) if name is not None: self.name = name self.options = options