Refactoring; arbitrary expression in lists

Frans Englich frans.englich at telia.com
Wed Jan 12 13:16:23 EST 2005


As continuation to a previous thread, "PyChecker messages", I have a question 
regarding code refactoring which the following snippet leads to:

> > runner.py:200: Function (detectMimeType) has too many returns (11)
> >
> > The function is simply a long "else-if" clause, branching out to
> > different return statements. What's wrong? It's simply a "probably ugly
> > code" advice?
>
> That is also advice.  Generally you use a dict of functions, or some other
> structure to lookup what you want to do.

More specifically, my function looks like this:

#--------------------------------------------------------------
def detectMimeType( filename ):

    extension = filename[-3:]
    basename = os.path.basename(filename)

    if extension == "php":
        return "application/x-php"

    elif extension == "cpp" or extension.endswith("cc"):
        return "text/x-c++-src"
# etcetera
    elif extension == "xsl":
        return "text/xsl"

    elif basename.find( "Makefile" ) != -1:
        return "text/x-makefile"
   else:
        raise NoMimeError
#--------------------------------------------------------------
(don't bother if the MIME detection looks like stone age, it's temporary until 
PyXDG gets support for the XDG mime type spec..)

I'm now wondering if it's possible to write this in a more compact way, such 
that the if-clause isn't necessary? Of course, the current code works, but 
perhaps it could be prettier.

I'm thinking along the lines of nested lists, but what is the obstacle for me 
is that both the test and return statement are simple expressions; not  
functions or a particular data type. Any ideas?


Cheers,

		Frans




More information about the Python-list mailing list