getattr() question

2007-12-22 Thread Sledge
Hi.

I am trying to dynamically load a class and attributes at run time.  I
do not know what classes will be referenced until run time.  I have it
loading the module correctly, but when I use getattr to access the
class and its attributes everything works except that I get additional
unwanted output.  The code



testclass.py:

#!/usr/bin/python

class testclass(object):

myname = ""

def __init__(self, name):
self.myname = name

def view(self):
print "hello %s" % self.myname



test.py:

#!/usr/bin/python

import sys
sys.path.append('.')
from pprint import pprint

if __name__ == '__main__':
myname = "testclass"
myaction = "view"
try:
tc = __import__(myname)
myclass = getattr(tc,myname)
myinstance = getattr(myclass('python n00b'), myaction,
myaction)
pprint(myinstance())
except ImportError:
"error"



Here is the output that I get:

[EMAIL PROTECTED]:~/$ python test.py
hello python n00b
None
[EMAIL PROTECTED]:~/$


Why is it printing 'None'?  What am I doing wrong.  I appreciate any
help.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: getattr() question

2007-12-22 Thread Sledge
On Dec 22, 7:14 pm, John Machin <[EMAIL PROTECTED]> wrote:
> On Dec 23, 10:39 am, Sledge <[EMAIL PROTECTED]> wrote:
>
>
>
> > Hi.
>
> > I am trying to dynamically load a class and attributes at run time.  I
> > do not know what classes will be referenced until run time.  I have it
> > loading the module correctly, but when I use getattr to access the
> > class and its attributes everything works except that I get additional
> > unwanted output.  The code
>
> > testclass.py:
>
> > #!/usr/bin/python
>
> > class testclass(object):
>
> > myname = ""
>
> > def __init__(self, name):
> > self.myname = name
>
> > def view(self):
> > print "hello %s" % self.myname
>
> > test.py:
>
> > #!/usr/bin/python
>
> > import sys
> > sys.path.append('.')
> > from pprint import pprint
>
> > if __name__ == '__main__':
> > myname = "testclass"
> > myaction = "view"
> > try:
> > tc = __import__(myname)
> > myclass = getattr(tc,myname)
> > myinstance = getattr(myclass('python n00b'), myaction,
> > myaction)
> > pprint(myinstance())
> > except ImportError:
> > "error"
>
> What do you expect to see if the import fails?
>
>
>
> > Here is the output that I get:
>
> > [EMAIL PROTECTED]:~/$ python test.py
> > hello python n00b
> > None
> > [EMAIL PROTECTED]:~/$
>
> > Why is it printing 'None'?  What am I doing wrong.  I appreciate any
> > help.
>
> The problem is nothing to do with using getattr; it "works" in the
> sense that it does what you appear to want it to.
>
> You have *two* explict outputting statements: the print statement in
> the first file and the pprint invocation in the second file. Seems
> fairly obvious that it's not the first of these. So dissect
> "pprint(myinstance())".
>
> myinstance is bound to the view method [in the first file] which
> (implicitly) returns None. So you are in effect doing pprint(None).

that did the trick.  How could I have missed something so obvious?

>
> Aside: give your fingers a rest: don't type "my" so often.

It was just for demonstration purposes :).  Thanks for your help John.
-- 
http://mail.python.org/mailman/listinfo/python-list