write a recognizer

Peter Otten __peter__ at web.de
Thu Feb 12 10:55:35 CET 2004


Klaus Neuner wrote:

> Hello,
> 
> I want to write a class Recognizer, like so:
> 
> class Recognizer(object):
> 
>     def is_of_category_1(self, token):
>         if token == 1:
>             return "1"
>         else:
>             return False
> 
>     def is_of_category_2(self, token):
>         if token == 2:
>             return "2"
>         else:
>             return False
> 
>     def recognize(self, token):
>         for fun in <?>:
>             result = apply(fun, token)
>             if result:
>                 return result
>         return False
> 
> What do I have to write instead of <?>?
> Or: How should I design the recognizer, if the above design is not good?
> 
> Klaus

The following assumes that all category checker method names start with a
common prefix. Those are automatically extracted in the __init__() method.
If you are interested in this technique, I stole it from cmd.py in the
library. IIRC, the implementation is more complete as it also inspects the
base classes.

class Recognizer(object):
    def __init__(self):
        r = self.recognizers = []
        for n in dir(self.__class__):
            if n.startswith("is_"):
                r.append(getattr(self, n))

    def is_of_category_1(self, token):
        if token == 1:
            return "1"

    def is_of_category_2(self, token):
        if token == 2:
            return "2"

    def recognize(self, token):
        # would also work:
        #for fun in [self.is_of_category_1, self.is_of_category_2]:

        for fun in self.recognizers:
            result = fun(token)
            if result:
                return result
        return False

if __name__ == "__main__":
    r = Recognizer()
    for t in "12341":
        print r.recognize(int(t)),
    print

Peter



More information about the Python-list mailing list