Skip to content
Home / Fundamentals

Typing in Python

Python, a dynamic programming language

Python is a popular, high-level programming language known for its simplicity, readability, and flexibility. It is a dynamically-typed language, which means that the type of a variable is not explicitly declared and is determined at runtime. This is in contrast to a statically-typed language, where the type of a variable must be explicitly declared and is checked at compile time.

Some potential advantages of a dynamically-typed language like Python include:

  • Quick prototyping: Since you don't have to explicitly declare the types of variables, you can write and test code faster.
  • Easy to read code: Dynamic typing can make the code more concise and easier to read because you don't have to include type declarations.
  • Flexibility: Dynamic typing allows you to easily change the type of a variable, which can be useful in certain situations.

However, there are also some potential disadvantages to consider:

  • Runtime errors: Since type checking is not done until runtime, it can be harder to catch type errors and other issues until the program is actually executed.
  • Reduced performance: In some cases, dynamically-typed languages can execute more slowly than statically-typed languages because the interpreter has to do more work at runtime to determine the types of variables.
  • Lack of type safety: Without explicit type declarations, it can be easier to make mistakes that result in type errors or unintended behavior.

What is Typing

Type hinting is a technique in Python that allows developers to annotate the types of variables, functions, and methods in their code. This is done using the typing module and is called type hinting or type annotation. Type hinting does not change the way the code is executed, but it provides type information that can be used by static type checkers to catch type errors before the code is run. It also helps other developers understand the expected types of variables and arguments when reading the code.

Here is an example of typed and untyped Python code for a simple function that takes an integer and returns its square:

# Untyped version

def square(n):
    return n ** 2

print(square(2))  # Output: 4
print(square("2"))  # Output: "22"
# Typed version

from typing import TypeVar, Callable

T = TypeVar("T", int, float)

def square(n: T) -> T:
    return n ** 2

print(square(2))  # Output: 4
print(square(2.0))  # Output: 4.0

# This will cause a type error, because the function expects a value of type T (int or float)
print(square("2"))  # Output: TypeError

In the untyped version, the square function can be called with any type of argument, and the returned value will have the same type as the argument. In the typed version, the function is annotated with type hints indicating that it expects an argument of type T (which is a type variable that can be either int or float) and returns a value of the same type. If you try to call the function with a value of a different type, a type error will be raised.

Type hinting can be a more effective way of conveying type information in your code than comments and documentation. This is because type hints are actually part of the code and are checked by static type checkers, whereas comments and documentation are easily ignored or out of date. Type hints are also more concise and easier to read than long blocks of text, making them a more efficient way of conveying information.

In addition, type hints can be used by code editors and IDEs to provide better code completion and error highlighting, which can improve the development experience and make it easier to write and debug code.

Why do you need to know about Typing

In many professional software development environments, knowledge of typing in Python is expected or required. This is because type hinting can help improve the quality and maintainability of code, especially in large codebases.

Static type checkers, like mypy, can use type hinting information to catch type errors before the code is run, which can save time debugging and make it easier to find and fix issues.

In addition, many code editors and IDEs can use type hinting information to provide better code completion, error highlighting, and other features, which can improve the development experience and make it easier to write and debug code.

Besides being a work requirement, typing can generally bring many improvements some of which we already mentioned:

  • Type hints can improve code readability and maintainability by making it easier to understand the expected types of values in a program.
  • Type hints can help catch type-related bugs early in the development process, potentially saving time and effort in the long run.
  • Type hints can improve the accuracy of code completion and documentation in IDEs and other tools.
  • Type hints can make it easier to refactor code, as they can help ensure that the correct types are used in the right places.
  • Type hints can improve the performance of Python programs by allowing the Python interpreter to generate more efficient bytecode.
  • Type hints can be used to create more robust APIs by clearly specifying the expected types of inputs and outputs.
  • Type hints can make it easier to write unit tests, as they can help ensure that the correct types of inputs are being used in tests.
  • Type hints can help document the design of a program, making it easier for other developers to understand and work with the code.
  • Type hints can be used to create more expressive and powerful type systems, such as those found in statically-typed languages.
  • Type hints can be used to enable static type checking, which can further improve code quality and reliability.