Automatic Type Annotations For Python
Jay Nagpaul / December 17, 2021
2 min read •
This guide assumes a working installation and basic knowledge of Python 3.6.x. First we'll install the library used to create automatic type annotations, MonkeyType by Instagram.
>>> pip install MonkeyType >>> pip install pytest
Then we'll create our example project to test out MonkeyType. Let's try it out with the fibonacci sequence.
>>> mkdir fibonacci >>> cd fibonacci
# fibonacci.py def fibonacci(n): if n == 0: return 0 elif n == 1: return 1 else: return fibonacci(n-1)+fibonacci(n-2)
Let's try it out
>>> fibonacci(10) 55 >>> fibonacci('10') Traceback (most recent call last): TypeError: unsupported operand type(s) for -: 'str' and 'int'
As you can see, this function is expecting for you to pass in an integer for it otherwise it will raise a type error. We can manually add the type annotation to help future consumers of this code, but being humans and programmers we often forget.
Great, we now have a file named fibonacci.py in our folder named fibonacci. Let's write a simple test for us to use.
# test.py from fibonacci import fibonacci as F def test_fibonacci(): assert F(10) == 55 assert F(0) == 0 assert F(1) == 1
We can test this out by running the command
Now it's time for us to collect the call traces. Run the command
monkeytype run test.py. You should see a new file appear "monkeytype.sqlite3", this is a sqlite database filled with each function call, and the types returned and passed in. We can apply type annotations with the command
monkeytype apply fibonacci.
Now check out the file fibonacci.py:
def fibonacci(n: int) -> int: if n == 0: return 0 elif n == 1: return 1 else: return fibonacci(n - 1) + fibonacci(n - 2)
Success! We have successfully added type annotations to our module with barely any work!