Klaus Neuner wrote:
Hello,

I am writing a program that analyzes files of different formats. I
would like to use a function for each format. Obviously, functions can
be mapped to file formats. E.g. like this:

if file.endswith('xyz'):
    xyz(file)
elif file.endswith('abc'):
    abc(file)

...

Yet, I would prefer to do something of the following kind:

func = file[-3:]
apply_func(func, file)


As mentioned, a dictionary dispatch will do what you want, but you can also use the self-registering technique outlined here:

http://effbot.org/zone/metaclass-plugins.htm [Fredrik Lundh]

(For Plugin, read Handler in this case.)

One idea might be to have Handler classes such as:

class TextHandler(HandlerType):
    extensions = ['', 'txt', 'rst']

    def run(self, *args, **kw):
        .... do stuff


then the __init__ of HandlerType's metaclass:

        def __init__(cls, name, bases, attrs):
            for ext in attrs.get('extensions', []):
                registry[ext] = cls

then use like:

 registry['txt']().run()

If you don't need state, you could perhaps make 'run' a staticmethod and store it rather than the class,

eg. registry[ext] = cls.run

and then just:

 registry['txt']()

hth

G.F

------------------------------------------------------------------------

registry = {}

class HandlerType(object):
    class __metaclass__(type):
        def __init__(cls, name, bases, attrs):
            for ext in attrs.get('extensions', []):
                registry[ext] = cls

class TextHandler(HandlerType):
    extensions = ['', 'txt']

print registry

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to