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