I've decided to attack the number one bug creator in my opinion, passing None to a function. If this were C, that would be like passing NULL. I can't really see why there would be a good place to do that and in my experiences its usually causing a bug. Beyond the basic reasons, its just semantically wrong to be passing around nothing. It sort of defeats the point of providing arguments at all. In python, we've got really nice default argument syntax so if you must have None for a argument, make that the default and don't pass anything. If you can't avoid this due to some API then I'm sorry.
Anyway, here's how I went after it; first I created a class which extends NodeTransformer and added this method:
def visit_Call(self, node): self.generic_visit(node) for x in chain(node.args, node.keywords): x = x.value if hasattr(x, 'value') else x if isinstance(x, Name) and x.id == 'None': warn("Passing None Argument to function", RuntimeWarning) return node
Then I just use that method in a simple function to create the ast and walk it:
with open(sys.argv[1]) as f: source = f.read() ast = parse(source, sys.argv[1]) node = StaticTransformer().visit(ast)
Now when I call this script and pass in any compilable Python code, if there are any warnings I'll know about them and be able to fix them before the code gets used elsewhere. It is easy to add more methods to check ast nodes, you just follow the visit_<Node> pattern for naming the functions in your NodeTransformer class. I've created a gist with the code that I've written so far, feel free to fork and contribute!