Tuesday 18 March 2008 — This is close to 17 years old. Be careful.
One of the side-effects of going to PyCon is getting immersed in some side project or other. Being immersed in all things Python for a few days away from the other usual complexities of life makes it a natural environment in which to dive deep.
This PyCon, I was ignited by a comment Matt Harrison made about there not being a tool to find code paths in Python. Having wrestled with the difficulty of analyzing Python code for coverage.py, I thought I could hack something together.
A few days later, the meager result is codepaths.py. It’s a command line script. Give it a Python source file, and it will report on the McCabe complexity measure of the functions and class methods within. The -m option is a minimum complexity measure below which functions are too uninteresting to include in the output (default 2). The -d option causes the output to be a Graphviz dot file for drawing the code path graphs. Without -d, the names and complexity measures are simply listed.
This will make a PNG file, for instance:
python codepaths.py -d mycode.py | dot -Tpng -o mycode.png
Weaknesses:
- The graphs are kind of wonky because I don’t know how to control Graphviz.
- Some Python constructs aren’t handled yet (try/except, while/else) because I don’t know how to account for them in the complexity measure.
- Files of any interesting size make graphs that are slow to draw and large to display.
- The graphs could be streamlined: coalescing consecutive simple statements, removing the join points after branches, and so on.
It’s a quick hack starting point. If people are interested, it will go some place. If not, it was a fun weekend project.
Comments
A final usage in my work would be auto-generated QA pages done through svn commit hooks.
[1] http://bitten.edgewall.org/
[2] http://bitten.edgewall.org/timeline
[3] http://bitten.edgewall.org/build/trunk
[4] http://bitten.edgewall.org/build/trunk/1237
c:\4>python -m mccabe "c:\MyBooks\AnExposure to Python3Programming\1Volume\source\Queens8.py"
15:0: 'Queens8' 13
111:0: 'DoDisplayBoard' 5
I modified the mccabe. The modification yields:
c:\MyBooks\AnExposure to Python3Programming\1Volume\source>python "C:\Dads\MySoftware\Sandbox\mymccabe.py" "c:\MyBooks\AnExposure to Python3Programming\1Volume\source\Queens8.py"
15:0: 'Queens8' 5
16:4: 'Queens8.Initialize' 1
31:4: 'Queens8.PlaceQueenOn' 1
45:4: 'Queens8.PlaceRestOfQueens' 5
48:8: 'Queens8.PlaceRestOfQueens.TakeQueen' 1
111:0: 'DoDisplayBoard' 5
If you are interested in the changes - email me : danbates@verizon.net
Add a comment: