Re: self modifying code
- From: Steven Bethard <steven.bethard@xxxxxxxxx>
- Date: Sat, 29 Apr 2006 17:09:10 -0600
John J. Lee wrote:
Robin Becker <robin@xxxxxxxxxxxxxxxxxxx> 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
.
- References:
- self modifying code
- From: Robin Becker
- Re: self modifying code
- From: John J. Lee
- self modifying code
- Prev by Date: resume picking items from a previous list
- Next by Date: Re: time conversions [hh:mm:ss.ms <-> sec(.ms)
- Previous by thread: Re: self modifying code
- Next by thread: Re: self modifying code
- Index(es):
Relevant Pages
|