self
Vojin Jovanovic
vjovanov at stevens-tech.edu
Tue Jun 4 15:49:06 EDT 2002
I don't see how that is going to work. In fact I tried things like that
before without success. Just sticking the dictionary into eval/exec is
missing the point. Every time parsing is done flow needs to go through
__getattr__ special method to evaluate nested equations. Without self. you
can't achieve that effect. Try the approach you suggested and you'll get
'#U'.
Vin
"Vojin Jovanovic" <vjovanov at stevens-tech.edu> wrote in message
news:TL7L8.79$4p7.4100181 at newnews.cc.stevens-tech.edu...
> > Which of i, j and k are instance variables? Which are locals? Which
are
> > globals? For all its virtues, Python isn't telepathic <wink>.
>
> Well, now that you pointed it out, I think that Python should be
telepathic.
> Those i,j and k variables should have been found in class C, otherwise
they
> should have been searched outside of the class. I read the FAQ page that
> somebody sent me and I really think that the main reason for self is ...
> "When classes were added to Python, this was (again) the simplest way of
> implementing methods without too many changes to the interpreter. " which
is
> the main and really lousy argument. All, other arguments are debatable.
>
> Now let me give you the problem with self which is making my life
> complicated. Consider this class.
>
> class Foo:
> def __init__(self):
> self.__dict__['Equations']={
> 'a':str(5),
> 'b':'self.a+5',
> 'c':'self.b*self.a'}
>
> def __getattr__(self,arg):
> if self.Equations.has_key(arg) == 0:
> raise AttributeError, "Foo instance has no attribute '" + arg + "'"
> try:
> try: #first check if this is a simple expression
> return eval(self.Equations[arg])
> except: #if not try to execute it
> exec self.Equations[arg]
> except: #if even that didn't work then just return undefined
> return '#U'
>
> def __setattr__(self,arg,val):
> self.__dict__['Equations'][arg]=str(val)
>
> def __delattr__(self,arg):
> del self.__dict__['Equations'][arg]
>
> This class implements a kind of symbolic behavior with the ability to add
> new equations on the fly. For example...
>
>
> >>> import foo
> >>> A=foo.Foo()
> >>> A.Equations
> {'b': 'self.a+5', 'c': 'self.b*self.a', 'a': '5'}
> >>> A.f='self.b*self.c'
> >>> A.f
> 500
> >>> A.Equations
> {'f': 'self.b*self.c', 'b': 'self.a+5', 'c': 'self.b*self.a', 'a': '5'}
>
>
> As you can see, equations get added on the fly and the parsing gets done
as
> the attribute is being called. Now, notice that ugly self. thing in the
> equations. Instead of just typing >>>A.f='a*c' I have to add self in
front
> a and c to achieve the desired effect. I could not find any other way to
> implement the class in order to avoid typing self. which of course it
> doesn't mean that there isn't any. If anybody has an idea how to do this
> please let me know. Otherwise, here is the situation where the self
> concept is bad and having such a dynamic language like Python I think
there
> has to be a way out of this problem.
>
> Why is this all relevant? Well, I am working on embedding an interpreted
> language in a large engineering application and Python is one of few
> candidates. So I have been looking for its pros and cons. So far it
passed
> all the tests except the above. Because, imagine if we required from the
> user of our system that he needs to type self. or even s. in front of
every
> new variable that he has in his equation, it would be a big turn off.
>
> Vin
>
>
>
More information about the Python-list
mailing list