newbie-one more example of difficulty in van Rossum's tutorial
Brian van den Broek
broek at cc.umanitoba.ca
Wed Dec 14 01:02:25 EST 2005
bobueland at yahoo.com said unto the world upon 2005-12-13 15:44:
> This is from 9.6 (Private variables). I quote
>
> - "Notice that code passed to exec, eval() or evalfile() does not
> consider the classname of the invoking class to be the current class;
> this is similar to the effect of the global statement, the effect of
> which is likewise restricted to code that is byte-compiled together.
> The same restriction applies to getattr(), setattr() and delattr(), as
> well as when referencing __dict__ directly."
>
> I've read the text so far but there has been no explaination of exec,
> eval() and evalfile() so far. I suspect they give ways for dynamic
> execution of text strings containing Python statements.
> But what does it mean that "code passed to exec, eval() or evalfile()
> does not consider the classname of the invoking class to be the current
> class"? What "invoking class"? What "current class".
>
> Now there's a hint:
>
> - "this is similar to the effect of the global statement, the effect of
> which is likewise restricted to code that is byte-compiled together."
>
> But what does this mean? So far global statement was only mention on
> page 64 by the sentence
>
> - "If a name is declared global, then all references and assignments go
> directly to the middle scope containing the module's global names."
>
> What has this to do with
>
> - " the effect of which is likewise restricted to code that is
> byte-compiled together."
>
> At last I learn that
>
> - "The same restriction applies to getattr(), setattr() and delattr(),
> as well as when referencing __dict__ directly."
>
> But getattr(), setattr() and delattr() and __dict__ has not been
> mentioned as far as I recollect.
>
> Since no examples are given I don't know what to do with this and what
> the intention was putting the text above in the tutorial.. Of course I
> can go to library reference and try to uncover the details there but
> it's not an easy job if you are a newbie (which is why I started with
> the tutorial to begin with).
>
> Well, I don't want to complain to much about a tutorial which is rather
> good but would appreciate some hint or reference which would help me to
> understand the quoted text.
>
> Bob
Hi Bob,
again, I'm no guru, so look to others for proper explanations. That
said, perhaps this code will help you see what is going on:
class A(object):
def __init__(self):
self.b = 1
self.__b = 42
def get__b(self):
return self.__b
def evalget(self, arg):
return eval("self.%s" %arg)
a=A()
print a.get__b()
print a.evalget('b')
print a.evalget('__b')
When run, this produces:
42
1
Traceback (most recent call last):
File "C:/Python24/foobar.py", line 13, in -toplevel-
print a.evalget('__b')
File "C:/Python24/foobar.py", line 8, in evalget
return eval("self.%s" %arg)
File "<string>", line 0, in -toplevel-
AttributeError: 'A' object has no attribute '__b'
>>>
In fuzzy terms, a method of a class doesn't have to mangle its __
names to access them. But, access through eval, etc. does require the
mangled reference; it is as if the eval doesn't know it is being
invoked in the class being accessed.
HTH,
Brian vdB
More information about the Python-list
mailing list