python-diskcache icon indicating copy to clipboard operation
python-diskcache copied to clipboard

memoization: with named parameter but positional argument, memoization `ignore={}` doesn't apply

Open tnielens opened this issue 4 years ago • 4 comments

@cache.memoize(ignore={'session'})
def get(entity_id: str, session):
  session.get(entity_id, timeout=..., ...)

session = db.Session(...)
# diskcache tries to serialize session and fails
get(1, session)

@cache.memoize(ignore={'session', 1}) works fine. But it's a little error-prone.

diskcache version: 5.3.1

tnielens avatar Dec 06 '21 11:12 tnielens

By design 🤷‍♂️

Could make “get” use keyword-only arguments (https://www.python.org/dev/peps/pep-3102/) to prevent the footgun.

grantjenks avatar Dec 06 '21 16:12 grantjenks

I expected the ignore parameter to work without specifying my parameter position. A bit of python doc on this might be helpful for users (I didn't find any). Maybe interesting to take into consideration: I'm changing one of my project from joblib to diskcache for memoization. Joblib implements the alternative approach and lets the user only specify the parameter name.

In any case, diskcache is really nice and I'm happy with the switch :+1:!

tnielens avatar Dec 06 '21 17:12 tnielens

Better docs would probably be good. If you want to add a sentence or two to the memoize docstrings then I think that would be a good place. Pull request welcome 👍

grantjenks avatar Dec 31 '21 00:12 grantjenks

I used this in anger and thought it could be done better. It would be nice if in the case given at the top, “session” would automatically work for either the keyword argument or positional argument. I get the ergonomics now.

Here’s the code in joblib: https://github.com/joblib/joblib/blob/0730b779fc9713d2deff66e1685d84e3f8530c60/joblib/func_inspect.py#L197 . Little complex but maybe that’s the best here.

grantjenks avatar Feb 17 '22 04:02 grantjenks