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

bob gailer bgailer at gmail.com
Tue Mar 15 04:39:37 CET 2011


On 3/14/2011 8:49 PM, Yaşar Arabacı wrote:
> As I try to implement things with getattr, I am getting a really 
> strange error. This is my file:

Various interspersed comments:
>
> #!/usr/bin/env python
> # -*- encoding:utf-8 -*-
> class global_variables:

It is customary to start class names with an uppercase letter

>     "Holds class attributes, so that other classes can share them"
>     products = 0
>     best_bundle = []
> class dispatcher:
>     def GetMethod(self,class_name,method_name):
>
It is customary to start method names with a lowercase letter
>
>         """This method first finds a class if desired classexists.
>         Then, instansites it, and returns a reference to desired 
> method of
>         the instance it created.
>         """
>
>         from sys import modules

It is customary to place import statements close to the top of the 
program, not in any class or function.

>         module = modules[self.__module__]
>         if hasattr(module,class_name):

What are the module's attributes?
insert print dir(module) to see ALL the attributes.

>             print "#debug : hasattr is true"
>             cls = getattr(module,class_name)
>         else:
>             print "#debug : hasattr is false"
>             return None
>
>         "if we get a valid class, lets instantie it"
>         if cls:
>             a=cls()
>         else:
>             return None
>         return hasattr(a,method_name) and getattr(a,method_name) or None
>
>     def dispatch_command(self):
>         """Gets command from user, finds appropriate Class/method to run
>         and then runs it. Beware of the fact that, to be able to 
> successfully
>         run the method, method should take exactly two arguments,
>         arg 1: instance of class which method resides (e.g. self)
>         arg 2: list of other needed variables
>
>         list of other variables can be used to get as many variables 
> as possible
>         """
>
>         command = raw_input(">>>")
>         args = command.split(" ")
>         if len(args) < 2:
>             return None
>         method = self.GetMethod(args[0],args[1])
>         return method and method(args[2:]) or None
>
> class calculate(global_variables):
>     def bundle(self,args):
>         print "your best bundle is -->"
>
> a = dispatcher()
> a.dispatch_command()

Alternative 1
- put all the user-callable class definitions inside a Container class 
(or whatever name you want)
     - then use getattr on the Container class
class Container:
   class Calculate(global_variables):
     def bundle(self,args):
         print "your best bundle is -->"

Alternative 2 - use the following to create a dictionary of classes in 
which you look up the desired class by name
   import sys, inspect
   thisModule = sys.modules[__name__]
   classDict = dict((name.lower(), value) for name, value in 
inspect.getmembers(thisModule, inspect.isclass))
...
   cls = classDict[className]

Alternative 3
     cls = getattr(module,class_name)
     try:
       if issubclass(cls, global_variables)
         a=cls()
     except TypeError:
       pass
>
> I wanted to see what happens when someone gives an nonexistent 
> function. But when I put a b, it gives me error, when I put c d it 
> doesn't. I don't have either a or c classes, but a somehow causes 
> problems :S This is what I did:
>
> yasar at yasar-laptop:~/best_buy> ./main.py
> >>>a b
> #debug : hasattr is true
> Traceback (most recent call last):
>   File "./main.py", line 57, in <module>
>     a.dispatch_command()
>   File "./main.py", line 44, in dispatch_command
>     method = self.GetMethod(args[0],args[1])
>   File "./main.py", line 25, in GetMethod
>     a=cls()
> AttributeError: dispatcher instance has no __call__ method

The error tells you what a is. Isn't it obvious now? Remember to read 
and understand such messages.

> yasar at yasar-laptop:~/best_buy> ./main.py
> >>>c d
> #debug : hasattr is false
>


-- 
Bob Gailer
919-636-4239
Chapel Hill NC



More information about the Tutor mailing list