On Tue, 18 Jun 2013 10:47:57 +0100, andrea crotti wrote:
> Using a CouchDB server we have a different database object potentially
> for every request.
>
> We already set that db in the request object to make it easy to pass it
> around form our django app, however it would be nice if I could set it
> once in the API and automatically fetch it from there.
>
> Basically I have something like
>
> class Entity:
> def save_doc(db)
> ...
You missed a self, and a colon :-)
> I would like basically to decorate this function in such a way that:
> - if I pass a db object use it
> - if I don't pass it in try to fetch it from a global object
> - if both don't exist raise an exception
def decorate(method):
@functools.wraps(method)
def inner(self, db=None, *args, **kwargs):
if db is None:
db = get_current_db()
return method(self, db, *args, **kwargs)
return inner
class Entity:
@decorate
def save_doc(self, db):
...
ought to do it, assuming get_current_db() raises an appropriate exception.
The usual Python argument passing rules apply. If you call the wrapped
function with positional arguments, db must be given explicitly. If you
call it with keyword arguments, it doesn't.
If you prefer, you can make db a keyword only argument:
# Python 3 version:
def decorate(method):
@functools.wraps(method)
def inner(self, *args, **kwargs, db=None):
if db is None:
db = get_current_db()
return method(self, db, *args, **kwargs)
return inner
# Python 2 version:
def decorate(method):
@functools.wraps(method)
def inner(self, *args, **kwargs):
db = kwargs.get('db', None)
try:
del kwargs['db']
except KeyError:
pass
if db is None:
db = get_current_db()
return method(self, db, *args, **kwargs)
return inner
--
Steven
--
http://mail.python.org/mailman/listinfo/python-list