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

Yaşar Arabacı yasar11732 at gmail.com
Tue Mar 15 02:49:01 CET 2011


As I try to implement things with getattr, I am getting a really strange 
error. This is my file:

#!/usr/bin/env python
# -*- encoding:utf-8 -*-
class global_variables:
	"Holds class attributes, so that other classes can share them"
	products = 0
	best_bundle = []
class dispatcher:
	def GetMethod(self,class_name,method_name):
		"""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
		module = modules[self.__module__]
		if hasattr(module,class_name):
			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()

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
yasar at yasar-laptop:~/best_buy> ./main.py
 >>>c d
#debug : hasattr is false



More information about the Tutor mailing list