getattr() question

John Machin sjmachin at lexicon.net
Sat Dec 22 19:14:06 EST 2007


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).

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




More information about the Python-list mailing list