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