Co-Evolution of Types and Dependencies: Towards Repository-Level Type Inference for Python Code
By: Shuo Sun , Shixin Zhang , Jiwei Yan and more
Python's dynamic typing mechanism, while promoting flexibility, is a significant source of runtime type errors that plague large-scale software, which inspires the automatic type inference techniques. Existing type inference tools have achieved advances in type inference within isolated code snippets. However, repository-level type inference remains a significant challenge, primarily due to the complex inter-procedural dependencies that are difficult to model and resolve. To fill this gap, we present \methodName, a novel approach based on LLMs that achieves repository-level type inference through the co-evolution of types and dependencies. \methodName~constructs an Entity Dependency Graph (EDG) to model the objects and type dependencies across the repository. During the inference process, it iteratively refines types and dependencies in EDG for accurate type inference. Our key innovations are: (1) an EDG model designed to capture repository-level type dependencies; (2) an iterative type inference approach where types and dependencies co-evolve in each iteration; and (3) a type-checker-in-the-loop strategy that validates and corrects inferences on-the-fly, thereby reducing error propagation. When evaluated on 12 complex Python repositories, \methodName~significantly outperformed prior works, achieving a \textit{TypeSim} score of 0.89 and a \textit{TypeExact} score of 0.84, representing a 27\% and 40\% relative improvement over the strongest baseline. More importantly, \methodName~removed new type errors introduced by the tool by 92.7\%. This demonstrates a significant leap towards automated, reliable type annotation for real-world Python development.
Similar Papers
TypyBench: Evaluating LLM Type Inference for Untyped Python Repositories
Software Engineering
Helps computers understand Python code types better.
Automated Type Annotation in Python Using Large Language Models
Programming Languages
Helps computers understand code better automatically.
Beyond Memorization: Evaluating the True Type Inference Capabilities of LLMs for Java Code Snippets
Software Engineering
Helps computers understand code better, not just copy.