specifying constants for a function (WAS: generator expressions: performance anomaly?)
Steven Bethard
steven.bethard at gmail.com
Fri Jan 21 20:57:58 EST 2005
I wrote:
> If you really want locals that don't contribute to arguments, I'd be
> much happier with something like a decorator, e.g.[1]:
>
> @with_consts(i=1, deftime=time.ctime())
> def foo(x, y=123, *args, **kw):
> return x*y, kw.get('which_time')=='now' and time.ctime() or deftime
>
> Then you don't have to mix parameter declarations with locals
> definitions.
>
> Steve
>
> [1] I have no idea how implementable such a decorator would be. I'd
> just like to see function constants declared separate from arguments
> since they mean such different things.
I played around with this, and I think it's basically implementable:
py> import new
py> class with_consts(object):
... def __init__(self, **consts):
... self.consts = consts
... def __call__(self, func):
... return new.function(func.func_code,
... dict(globals(), **self.consts))
...
py> @with_consts(y=123)
... def f(x):
... return x*y, str
...
py> f(2)
(246, <type 'str'>)
I just update the function globals with the keywords passed to the
decorator. The only problem is that updates to globals() aren't
reflected in the function's globals:
py> str = 5
py> f(2)
(246, <type 'str'>)
Steve
More information about the Python-list
mailing list