From 96d83ad1db48a6ef0584691e75963cb3e326fdc3 Mon Sep 17 00:00:00 2001 From: Simon Persson Date: Fri, 10 May 2019 19:29:51 +0200 Subject: [PATCH] Move lazy_property to util package. --- beets/library.py | 19 +------------------ beets/util/__init__.py | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/beets/library.py b/beets/library.py index 0ca718ee0..103054fd3 100644 --- a/beets/library.py +++ b/beets/library.py @@ -24,14 +24,13 @@ import time import re import six import string -import functools from beets import logging from beets.mediafile import MediaFile, UnreadableFileError from beets import plugins from beets import util from beets.util import bytestring_path, syspath, normpath, samefile, \ - MoveOperation + MoveOperation, lazy_property from beets.util.functemplate import Template from beets import dbcore from beets.dbcore import types @@ -369,22 +368,6 @@ class LibModel(dbcore.Model): return self.__str__().encode('utf-8') -def lazy_property(func): - field_name = '_' + func.__name__ - - @property - @functools.wraps(func) - def wrapper(self): - if hasattr(self, field_name): - return getattr(self, field_name) - - value = func(self) - setattr(self, field_name, value) - return value - - return wrapper - - class FormattedItemMapping(dbcore.db.FormattedMapping): """Add lookup for album-level fields. diff --git a/beets/util/__init__.py b/beets/util/__init__.py index f5ad2da22..e2348cf6e 100644 --- a/beets/util/__init__.py +++ b/beets/util/__init__.py @@ -23,6 +23,7 @@ import locale import re import shutil import fnmatch +import functools from collections import Counter from multiprocessing.pool import ThreadPool import traceback @@ -1031,3 +1032,26 @@ def par_map(transform, items): pool.map(transform, items) pool.close() pool.join() + + +def lazy_property(func): + """A decorator that creates a lazily evaluated property. On first access, + the property is assigned the return value of `func`. This first value is + stored, so that future accesses do not have to evaluate `func` again. + + This behaviour is useful when `func` is expensive to evaluate, and it is + not certain that the result will be needed. + """ + field_name = '_' + func.__name__ + + @property + @functools.wraps(func) + def wrapper(self): + if hasattr(self, field_name): + return getattr(self, field_name) + + value = func(self) + setattr(self, field_name, value) + return value + + return wrapper