On Sat, 22 Jan 2005 16:22:33 +1000, Nick Coghlan <[EMAIL PROTECTED]> wrote:
>Steven Bethard wrote: >> 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: > >Raymond's constant binding decorator is probably a good model for how to do it: >http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/277940 > I thought so too. I modified it to accept **presets as a keyword argument and generate constants and assignments from its values matching assignment names when the rhs was __frompresets__, e.g., >>> from makeconstpre import make_constants as pre >>> import time >>> @pre(verbose=True, deftime=time.ctime(), a=1, b=2, c=3, >>> pi=__import__('math').pi) ... def foo(): ... deftime = __frompresets__ ... b, a = __frompresets__ ... c = __frompresets__ ... pi = __frompresets__ ... return locals() ... __frompresets__ : deftime --> Sat Jan 22 20:18:09 2005 __frompresets__ : ('b', 'a') --> (2, 1) __frompresets__ : c --> 3 __frompresets__ : pi --> 3.14159265359 locals --> <built-in function locals> >>> import dis >>> dis.dis(foo) 3 0 LOAD_CONST 1 ('Sat Jan 22 20:18:09 2005') 3 STORE_FAST 3 (deftime) 4 6 LOAD_CONST 2 ((2, 1)) 9 UNPACK_SEQUENCE 2 12 STORE_FAST 2 (b) 15 STORE_FAST 0 (a) 5 18 LOAD_CONST 3 (3) 21 STORE_FAST 1 (c) 6 24 LOAD_CONST 4 (3.1415926535897931) 27 STORE_FAST 4 (pi) 7 30 LOAD_CONST 5 (<built-in function locals>) 33 CALL_FUNCTION 0 36 RETURN_VALUE >>> foo() {'a': 1, 'c': 3, 'pi': 3.1415926535897931, 'b': 2, 'deftime': 'Sat Jan 22 20:18:09 2005'} Not vary tested as yet, but seems to work. I want to eliminate redundant constants if the same name is assigned = __frompresets__ more than once. Right now I brute force generate another constant. Regards, Bengt Richter -- http://mail.python.org/mailman/listinfo/python-list