import dis import sys LOAD_CONST = dis.opmap['LOAD_CONST'] def dump_load_const(code): # Do not show first argument unused = set(range(1, len(code.co_consts))) for _, op, arg in dis._unpack_opargs(code.co_code): if op != LOAD_CONST: continue unused.discard(arg) if unused: print(f"Code: {code.co_name} {code.co_filename}:{code.co_firstlineno}") print("Unused consts:") for i in sorted(unused): print(f" {i} {code.co_consts[i]!r}") def dump_load_const_recursive(code): dump_load_const(code) for cc in code.co_consts: if hasattr(cc, "co_code"): dump_load_const_recursive(cc) def dump_load_const_infile(fn): with open(fn, "rb") as f: source = f.read() code = compile(source, fn, "exec") dump_load_const_recursive(code) if __name__ == '__main__': dump_load_const_infile(sys.argv[1])