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



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

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to