1What inspired **Typer**, how it compares to other alternatives and what it learned from them.
2
3## Intro
4
5**Typer** wouldn't exist if not for the previous work of others.
6
7There have been many tools created before that have helped inspire its creation.
8
9## Previous tools
10
11### <a href="https://docs.python.org/3/library/argparse.html" class="external-link" target="_blank">`argparse`</a>
12
13`argparse` is the Python standard library's module to write CLIs.
14
15It provides a better alternative than reading the *CLI Parameters* as a `list` of `str` and parsing everything by hand.
16
17!!! check "Inspired **Typer** to"
18    Provide a better development experience than just reading *CLI Parameters* by hand.
19
20### <a href="https://www.hug.rest/" class="external-link" target="_blank">Hug</a>
21
22Hug is a library to create APIs and CLIs, it uses parameters in functions to declare the required data.
23
24It inspired a lot of the ideas in **FastAPI** and **Typer**.
25
26!!! check "Inspired **Typer** to"
27    Use function parameters to declare *CLI arguments* and *CLI options* as it simplifies a lot the development experience.
28
29### <a href="https://micheles.github.io/plac/" class="external-link" target="_blank">Plac</a>
30
31Plac is another library to create CLIs using parameters in functions, similar to Hug.
32
33!!! check "Inspired **Typer** to"
34    Provide a simple way to use a function as a command line app, without having to create a complete app, with `typer.run(some_function)`.
35
36### <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic</a>
37
38Pydantic is a library to handle data validation using standard modern Python type annotations.
39
40It powers **FastAPI** underneath.
41
42It is not used by **Typer**, but it inspired a lot of the design (through **FastAPI**).
43
44!!! check "Inspired **Typer** to"
45    Use standard Python type annotations to declare types instead of library-specific types or classes and use them for data validation and documentation.
46
47### <a href="https://click.palletsprojects.com" class="external-link" target="_blank">Click</a>
48
49Click is one of the most widely used libraries to create CLIs in Python.
50
51It's a very powerful tool and there are many CLIs built with it. It is what powers **Typer** underneath.
52
53It also uses functions with parameters for *CLI arguments* and *CLI options*, but the declaration of the specific *CLI arguments*, *CLI options*, types, etc, is done in decorators on top of the function. This requires some code repetition (e.g. a *CLI Option* name `--verbose` and a variable name `verbose`) and synchronization between two places related to the same information (the decorator and the parameter function).
54
55It uses decorators on top of functions to modify the actual value of those functions, converting them to instances of a specific class. This is a clever trick, but code editors can't provide great support for autocompletion that way.
56
57It was built with some great ideas and design using the features available in the language at the time (Python 2.x).
58
59!!! check "**Typer** uses it for"
60    Everything. ��
61
62    **Typer** mainly adds a layer on top of Click, making the code simpler and easier to use, with autocompletion everywhere, etc, but providing all the powerful features of Click underneath.
63
64    As someone pointed out: <em><a href="https://twitter.com/fishnets88/status/1210126833745838080" class="external-link" target="_blank">"Nice to see it is built on Click but adds the type stuff. Me gusta!"</a></em>
65
66### <a href="https://github.com/click-contrib/click-completion" class="external-link" target="_blank">`click-completion`</a>
67
68`click-completion` is a plug-in for Click. It was created to extend completion support for shells when Click only had support for Bash completion.
69
70Previous versions of **Typer** had deep integrations with `click-completion` and used it as an optional dependency. But now all the completion logic is implemented internally in **Typer** itself, the internal logic was heavily inspired and using some parts of `click-completion`.
71
72And now **Typer** improved it to have new features, tests, some bug fixes (for issues in plain `click-completion` and Click), and better support for shells, including modern versions of PowerShell (e.g. the default versions that come with Windows 10).
73
74!!! check "Inspired **Typer** to"
75    Provide auto completion for all the shells.
76
77### <a href="https://fastapi.tiangolo.com/" class="external-link" target="_blank">FastAPI</a>
78
79I created **FastAPI** to provide an easy way to build APIs with autocompletion for everything in the code (and some other <a href="https://fastapi.tiangolo.com/features/" class="external-link" target="_blank">features</a>).
80
81**Typer** is the "FastAPI of CLIs".
82
83It uses the same design and usage of FastAPI as much as possible. So, if you have used FastAPI, you know how to use Typer.
84