Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.python > #48625
| From | Wolfgang Maier <wolfgang.maier@biologie.uni-freiburg.de> |
|---|---|
| Subject | Re: decorator to fetch arguments from global objects |
| Date | 2013-06-18 13:25 +0000 |
| References | <CAF_E5JYg39VdwmLFnyXNOMPRx1UD8ZNGiBRpqgU=A_9rU_ukpw@mail.gmail.com> |
| Newsgroups | comp.lang.python |
| Message-ID | <mailman.3530.1371561975.3114.python-list@python.org> (permalink) |
andrea crotti <andrea.crotti.0 <at> gmail.com> writes:
>
>
> 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)
> ...
>
> 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
>
> Now it kinda of works already with the decorator below.
> The problem is that the argument is positional so I end up maybe passing
it twice.
> So I have to enforce that 'db' if there is passed as first argument..
>
> It would be a lot easier removing the db from the arguments but then it
would look too magic and I didn't want to change the signature.. any other
advice?
>
> def with_optional_db(func):
> """Decorator that sets the database to the global current one if
> not passed in or if passed in and None
> """
> <at> wraps(func)
> def _with_optional_db(*args, **kwargs):
> func_args = func.func_code.co_varnames
> db = None
> # if it's defined in the first elements it needs to be
> # assigned to *args, otherwise to kwargs
> if 'db' in func_args:
> assert 'db' == func_args[0], "Needs to be the first defined"
> else:
> db = kwargs.get('db', None)
>
> if db is None:
> kwargs['db'] = get_current_db()
>
> assert kwargs['db'] is not None, "Can't have a not defined database"
> ret = func(*args, **kwargs)
> return ret
>
> return _with_optional_db
>
I'm not sure, whether your code would work. I get the logic for the db in
kwargs case, but why are you checking whether db is in func_args? Isn't the
real question whether it's in args ?? In general, I don't understand why you
want to use .func_code.co_varnames here. You know how you defined your
function (or rather method):
class Entity:
def save_doc(db):
...
Maybe I misunderstood the problem?
Wolfgang
Back to comp.lang.python | Previous | Next | Find similar | Unroll thread
Re: decorator to fetch arguments from global objects Wolfgang Maier <wolfgang.maier@biologie.uni-freiburg.de> - 2013-06-18 13:25 +0000
csiph-web