Your code could be simplified and corrected by making use of the ast module. The only error that could not be reimplemented at the ast level is "Usage of print without parentheses."
Example code checking "Reassinged builtin", "missing docstring" and __name__ not used:
import ast
import builtins
BUILTIN_NAMES = [name for name in dir(builtins) if not name.startswith("_")]
class ErrorChecker(ast.NodeVisitor):
def __init__(self):
self.errors = set()
self.name_used = False
def visit_Name(self, node):
if node.id in BUILTIN_NAMES and isinstance(node.ctx,ast.Store):
self.errors.add(BUILTIN_REASSIGNED_ERROR)
elif node.id == "__name__":
self.name_used = True
def visit_FunctionDef(self, node):
if not ast.get_docstring(node):
self.errors.add(NO_DOCS_ERROR)
self.generic_visit(node)
visit_ClassDef = visit_FunctionDef
The other errors checkers could all be similarly implemented at AST level, which would make them not accidentally catch bad statements in string literals or get confused by string literals.
The "missing parentheses around print function" error can also be checked for using the python parser/compiler:
import __future__
try:
compile(code, FILENAME, "exec", __future__.print_function.compiler_flag)
except SyntaxError:
#Code uses print without parentheses