Victor Stinner wrote: > Hi, > A pattern that I used multiple times is to compute an object attribute > only once and cache the result into the object. Dummy example:
How is that different from https://docs.python.org/3/library/functools.html?highlight=cached_property#functools.cached_property? -Brett > class X: > def __init__(self, name): > self.name = name > self._cached_upper = None > def _get(self): > if self._cached_upper is None: > print("compute once") > self._cached_upper = self.name.upper() > return self._cached_upper > upper = property(_get) > > obj = X("victor") > print(obj.upper) > print(obj.upper) # use cached value > It would be interesting to be able to replace obj.upper property with > an attribute (to reduce the performance overhead of calling _get() > method), but "obj.upper = value" raises an error since the property > prevents to set the attribute. > I understood that the proposed @called_once would store the cached > value into the function namespace. > Victor > Le lun. 27 avr. 2020 à 23:44, t...@tomforb.es a écrit : > > > > Hello, > > After a great discussion in python-ideas[1][2] it was suggested that I > > cross-post this > > proposal to python-dev to gather more comments from those who don't follow > > python-ideas. > > The proposal is to add a "call_once" decorator to the functools module > > that, as the > > name suggests, calls a wrapped function once, caching the result and > > returning it with > > subsequent invocations. The rationale behind this proposal is that: > > > > Developers are using "lru_cache" to achieve this right now, which is less > > efficient > > than it could be > > Special casing "lru_cache" to account for zero arity methods isn't trivial > > and we > > shouldn't endorse lru_cache as a way of achieving "call_once" semantics > > Implementing a thread-safe (or even non-thread safe) "call_once" method is > > non-trivial > > It complements the lru_cache and cached_property methods currently present > > in > > functools. > > > > The specifics of the method would be: > > > > The wrapped method is guaranteed to only be called once when called for the > > first time > > by concurrent threads > > Only functions with no arguments can be wrapped, otherwise an exception is > > thrown > > There is a C implementation to keep speed parity with lru_cache > > > > I've included a naive implementation below (that doesn't meet any of the > > specifics > > listed above) to illustrate the general idea of the proposal: > > def call_once(func): > > sentinel = object() # in case the wrapped method returns None > > obj = sentinel > > @functools.wraps(func) > > def inner(): > > nonlocal obj, sentinel > > if obj is sentinel: > > obj = func() > > return obj > > return inner > > > > I'd welcome any feedback on this proposal, and if the response is > > favourable I'd love > > to attempt to implement it. > > > > https://mail.python.org/archives/list/python-id...@python.org/thread/5OR3LJO... > > https://discuss.python.org/t/reduce-the-overhead-of-functools-lru-cache-for-... > > > > > > Python-Dev mailing list -- python-dev@python.org > > To unsubscribe send an email to python-dev-le...@python.org > > https://mail.python.org/mailman3/lists/python-dev.python.org/ > > Message archived at > > https://mail.python.org/archives/list/python-dev@python.org/message/5CFUCM4W... > > Code of Conduct: http://python.org/psf/codeofconduct/ > > -- > Night gathers, and now my watch begins. It shall not end until my death. _______________________________________________ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/TYUV24XOPPWBK6HRK24A3BRDF4VGMQOT/ Code of Conduct: http://python.org/psf/codeofconduct/