getattr() question

Sledge andrew.j.sledge at gmail.com
Sat Dec 22 19:34:53 EST 2007


On Dec 22, 7:14 pm, John Machin <sjmac... at lexicon.net> wrote:
> On Dec 23, 10:39 am, Sledge <andrew.j.sle... at gmail.com> 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:
>
> > user at debian:~/$ python test.py
> > hello python n00b
> > None
> > user at debian:~/$
>
> > 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.



More information about the Python-list mailing list