self modifying code
Steven Bethard
steven.bethard at gmail.com
Sat Apr 29 19:09:10 EDT 2006
John J. Lee wrote:
> Robin Becker <robin at NOSPAMreportlab.com> 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
More information about the Python-list
mailing list