John J. Lee wrote: > Robin Becker <[EMAIL PROTECTED]> writes: > >> When young I was warned repeatedly by more knowledgeable folk that self >> modifying code was dangerous. >> >> Is the following idiom dangerous or unpythonic? >> >> def func(a): >> global func, data >> data = somethingcomplexandcostly() >> def func(a): >> return simple(data,a) >> return func(a) > > 1. I don't think most people would call that "self-modifying code". I > won't try defining that term precisely because I know you'll just > pick holes in my definition ;-) > > 2. The use of global func is just plain weird :-) > > 3. Peter Otten's version is OK, but how about this, using a closure > instead of globals (UNTESTED) > > def make_func(): > namespace = object() > namespace.data = None > def func(a): > if namespace.data is None: > namespace.data = somethingcomplexandcostly() > return simple(namespace.data, a) > return func > func = make_func()
Unfortunately, this doesn't work because you can add attributes to plain object instances: >>> namespace = object() >>> namespace.data = None Traceback (most recent call last): File "<interactive input>", line 1, in ? AttributeError: 'object' object has no attribute 'data' Maybe you want something like: >>> def make_func(): ... def func(a): ... if func.data is None: ... func.data = somethingcomplexandcostly() ... return simple(func.data, a) ... func.data = None ... return func ... >>> func = make_func() >>> def somethingcomplexandcostly(): ... print 'executing somethingcomplexandcostly' ... return 42 ... >>> def simple(data, a): ... return data, a ... >>> func(1) executing somethingcomplexandcostly (42, 1) >>> func(2) (42, 2) STeVe -- http://mail.python.org/mailman/listinfo/python-list