  Dynamically typed languages such as Python have become very popular. Among
other strengths, Python's dynamic nature and its straightforward linking to
native code have made it the de-facto language for many research areas such as
Artificial Intelligence. This flexibility, however, makes static analysis very
hard. While creating a sound, or a soundy, analysis for Python remains an open
problem, we present in this work Serenity, a framework for static analysis of
Python that turns out to be sufficient for some tasks. The Serenity framework
exploits two basic mechanisms: (a) reliance on dynamic dispatch at the core of
language translation, and (b) extreme abstraction of libraries, to generate an
abstraction of the code. We demonstrate the efficiency and usefulness of
Serenity's analysis in two applications: code completion and automated machine
learning. In these two applications, we demonstrate that such analysis has a
strong signal, and can be leveraged to establish state-of-the-art performance,
comparable to neural models and dynamic analysis respectively.
