# if statements with or w/o else statements

Bart Nessux bart_nessux at hotmail.com
Mon Feb 23 19:48:26 CET 2004

```Peter Otten wrote:
> Bart Nessux wrote:
>
>
>>Should an if statement have a corresponding else statement? Or, is it OK
>>to have an if statement by itself. For completeness, it seems the two
>>should be together, but from experience I know that a if statement by
>>itself works just fine. Below is an example:
>>
>>if x >=0:
>>    DO SOMETHING
>>
>>Would it be better, or perhaps more complete, written like this:
>>
>>if x >=0:
>>    DO SOMETHING
>>else:
>>    DO SOMETHING ELSE
>
>
> No direct answer, but a good way to learn about this kind of questions is to
> study real code, and the best way to learn from the masters would probably
> be to look into the python library.
>
> Now, from the pointless statistics department, a little script that counts
> occurences of both if and if...else:
>
> <ifstats.py>
> #!/usr/bin/env python
> """ Analyse if statements in python scripts
> """
> __author__ = "Peter Otten"
> __category__ = "Pointless statistics"
>
> import compiler
>
> class IfStats:
>     def __init__(self):
>             self.total = 0
>             self.withElse = 0
>     def __str__(self):
>             return "%d of %d if statements have an else branch" %
> (self.withElse, self.total)
>     def visitIf(self, node):
>             self.total += 1
>             if node.else_:
>                     self.withElse += 1
>
> if __name__ == "__main__":
>     import os, sys, optparse
>     parser = optparse.OptionParser(
>         usage="usage: \%ifstats [-v] [-r] folder1 ... folderN",
>         description="scan python scripts for if statements with or without
> else branch")
>     parser.add_option("-v", "--verbose", action="store_true",
>         help="print info about every processed file")
>     parser.add_option("-r", "--recursive", action="store_true",
>         help="recursively collect files")
>     options, args = parser.parse_args()
>
>     totalFiles = 0
>     totalIf = 0
>     totalWithElse = 0
>     failed = 0
>     for root in args:
>         for path, folders, files in os.walk(root):
>             for fn in files:
>                 if fn.endswith(".py"):
>                     fp = os.path.join(path, fn)
>                     try:
>                         a = compiler.parseFile(fp)
>                     except:
>                         failed += 1
>                         print >> sys.stderr, "%s --> FAILED" % fp
>                     else:
>                         stats = IfStats()
>                         compiler.walk(a, stats)
>                         if options.verbose:
>                             print "%s --> %s" % (fp, stats)
>                         else:
>                             sys.stdout.write(".")
>                             sys.stdout.flush()
>                         totalIf += stats.total
>                         totalWithElse += stats.withElse
>                         totalFiles += 1
>             if not options.recursive: break
>     print
>     print "%d of %d if statements with else branch" % (totalWithElse,
> totalIf)
>     print "in %d files" % totalFiles
>     if failed:
>         print "parsing failed for %d files" % failed
> </ifstats.py>
>
> It turns out that only 2039 of 11157 if statements in the standard library
> have an else branch. Now draw your own conclusions...
>
> Peter
>

Thanks Peter. That's an easy conclusion to come to.

```