grantjenks / python-diskcache

Python disk-backed cache (Django-compatible). Faster than Redis and Memcached. Pure-Python.
http://www.grantjenks.com/docs/diskcache/
Other
2.38k stars 134 forks source link

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

Open tnielens opened 2 years ago

tnielens commented 2 years ago
@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

grantjenks commented 2 years ago

By design 🤷‍♂️

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

tnielens commented 2 years ago

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:!

grantjenks commented 2 years ago

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 commented 2 years ago

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.