"Frans Englich" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > > 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 <snip>
Since the majority of your tests will be fairly direct 'extension "XYZ" means mimetype "aaa/bbb"', this really sounds like a dictionary type solution is called for. Still, you might have some desire to do some order-dependent testing. Here are two ideas - the first iterates over a list of expressions and resulting types, the other uses a dictionary lookup. -- Paul import os extToMimeMap = [ ('"php"', "application/x-php"), ('"cpp" or extension.endswith("cc")', "text/x-c++-src"), ('"xsl"', "text/xsl"), ] def detectMimeType1( filename ): extension = filename[-3:] basename = os.path.basename(filename) for exp,mimetype in extToMimeMap: if eval("extension=="+exp): return mimetype # do other non-extension-related tests here if basename.find( "Makefile" ) != -1: return "text/x-makefile" else: raise NoMimeError extToMimeDict = { "php": "application/x-php", "cpp": "text/x-c++-src", "xsl": "text/xsl", } def detectMimeType2( filename ): extension = filename[-3:] basename = os.path.basename(filename) # check for straight extension matches try: return extToMimeDict[extension] except KeyError: pass # do more complex extension and other non-extension-related tests here if extension.endswith("cc"): return extToMimeDict["cpp"] if basename.find( "Makefile" ) != -1: return "text/x-makefile" raise NoMimeError for detectMimeType in (detectMimeType1, detectMimeType2): for s in ("a.php","z.acc","Makefile","blork.xsl"): print s,"->",detectMimeType(s) -- http://mail.python.org/mailman/listinfo/python-list