我尝试使用ast模块:
import ast# which syntax elements are allowed at module level?whitelist = [ # docstring lambda x: isinstance(x, ast.Expr) and isinstance(x.value, ast.Str), # import lambda x: isinstance(x, ast.import), # class lambda x: isinstance(x, ast.ClassDef), # function lambda x: isinstance(x, ast.FunctionDef),]def validate(source, required_functions): tree = ast.parse(source) functions = set() required_functions = set(required_functions) for item in tree.body: if isinstance(item, ast.FunctionDef): functions.add(item.name) continue if all(not checker(item) for checker in whitelist): return False # at least the required functions must be there return len(required_functions - functions) == 0if __name__ == "__main__": required_funcs = [ "init", "execute", "cleanup" ] with open("/tmp/test.py", "rb") as f: print("yay!" if validate(f.read(), required_funcs) else "d'oh!")


