[Tutor] How to use a str object, to find the class in exact name?

Steven D'Aprano steve at pearwood.info
Mon Mar 14 23:14:09 CET 2011

Yaşar Arabacı wrote:
> Hi
> I am trying to do something like this:

If you are trying to write a mini-language, the ``cmd`` and ``shlex`` 
modules in the standard library may be useful to you.

> #!/usr/bin/env python
> def command_dispatcher():
>     "Takes comman line arguments and executes regardin method"
>     command = raw_input(">>>")
>     args = command.split(" ")
>     args[0].args[1]

The error you get tells you exactly what is wrong:

AttributeError: 'str' object has no attribute 'args'

When you split the line, you get a list of strings. You extract the 
first string using args[0], and then look up the attribute "args" on 
that string, and finally look up the second element of that result. But 
strings don't have an attribute called args.

Try this instead:

getattr(args[0], args[1])

When you do that, you'll run into a bunch of new and exciting errors, 
starting with the fact that nothing appears to happen. Try it and see.

What you will eventually need to do is:

* create a class instance and store it somewhere
* call the method on the class instance
* print its output

none of which is yet done by your script. So far, all it does it try to 
look up a method on a class, then throw the result away without doing 
anything :)

> class calculate:
>     def bundle(self):
>         print __class__
> command_dispatcher()

calculate.bundle won't do anything except fail, because __class__ is not 
a local variable.

It's better to have the methods return a result, rather than print, and 
then have the command_dispatcher responsible for printing it. That lets 
you chain methods to make more powerful functions.

Good luck, and have fun!


More information about the Tutor mailing list