3.1. Typing Basic

  • Also known as: "type annotations", "type hints", "gradual typing"

  • Types are not required, and never will be

  • Good IDE will give you hints

  • Types are used extensively in system libraries

  • More and more books and documentations use types

  • Introduced in Python 3.5

  • Since Python 3.5: PEP 484 -- Type Hints

  • Since Python 3.6: PEP 526 -- Syntax for Variable Annotations

  • Since Python 3.8: PEP 544 -- Protocols: Structural subtyping (static duck typing)

  • Since Python 3.9: PEP 585 -- Type Hinting Generics In Standard Collections

  • Since Python 3.10: PEP 604 -- Allow writing union types as X | Y

  • To type check use: mypy, pyre-check, pytypes

Types are not required, and never will be. -- Guido van Rossum, Python initiator, core developer, former BDFL

It should be emphasized that Python will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory, even by convention. -- Python Software Foundation

../../_images/typeannotation-timeline.png

Figure 3.3. Timeline of changes to type annotations from Python 3.0 to now [1]

3.1.1. Int

  • Used to inform static type checker that the variable should be int

Declaration:

>>> data: int
>>> data: int = 1
>>> data: int = -1

Example:

>>> data: int
>>>
>>> data = 1        # ok
>>> data = -1       # ok
>>> data = 'hello'  # error

3.1.2. Float

  • Used to inform static type checker that the variable should be float

Declaration:

>>> data: float
>>> data: float = 0.0
>>> data: float = 1.23
>>> data: float = -1.23

Example:

>>> data: float
>>>
>>> data = 1.0        # ok
>>> data = -1.0       # ok
>>> data = 'hello'    # error

3.1.3. Str

  • Used to inform static type checker that the variable should be str

Declaration:

>>> data: str
>>> data: str = ''
>>> data: str = 'hello'

Example:

>>> data: str
>>>
>>> data = 'Mark'           # ok
>>> data = 'Watney'         # ok
>>> data = 'Mark Watney'    # ok

3.1.4. Bool

  • Used to inform static type checker that the variable should be bool

Declaration:

>>> data: bool
>>> data: bool = True
>>> data: bool = False

Example:

>>> data: bool
>>>
>>> data = True     # ok
>>> data = False    # ok
>>> data = None     # error

3.1.5. None

  • Used to inform static type checker that the variable should be None

Declaration:

>>> data: None
>>> data: None = None

Example:

>>> data: None
>>>
>>> data = True     # error
>>> data = False    # error
>>> data = None     # ok

3.1.6. Errors

  • Types are not Enforced

  • This code will run without any problems

  • Types are not required, and never will be

  • Although mypy, pyre-check or pytypes will throw error

>>> name: int = 'Mark Watney'

3.1.7. Use Case - 0x01

>>> firstname: str = 'Mark'
>>> lastname: str = 'Watney'
>>> age: int = 40
>>> adult: bool = True

3.1.8. Further Reading

3.1.9. References

3.1.10. Assignments

Code 3.30. Solution
"""
* Assignment: Typing Basic Int
* Complexity: easy
* Lines of code: 3 lines
* Time: 2 min

English:
    1. Declare proper types for variables
    2. Run doctests - all must succeed

Polish:
    1. Zadeklaruj odpowiedni typ zmiennych
    2. Uruchom doctesty - wszystkie muszą się powieść

Tests:
    >>> import sys; sys.tracebacklimit = 0

    >>> assert a == 1, \
    'Do not modify variable `a` value, just add type annotation'
    >>> assert b == 0, \
    'Do not modify variable `b` value, just add type annotation'
    >>> assert c == -1, \
    'Do not modify variable `c` value, just add type annotation'
"""

# Declare proper types for variables
a: ... = 1
b: ... = 0
c: ... = -1

Code 3.31. Solution
"""
* Assignment: Typing Basic Float
* Complexity: easy
* Lines of code: 3 lines
* Time: 2 min

English:
    1. Declare proper types for variables
    2. Run doctests - all must succeed

Polish:
    1. Zadeklaruj odpowiedni typ zmiennych
    2. Uruchom doctesty - wszystkie muszą się powieść

Tests:
    >>> import sys; sys.tracebacklimit = 0

    >>> assert a == 1.0, \
    'Do not modify variable `a` value, just add type annotation'
    >>> assert b == 0.0, \
    'Do not modify variable `b` value, just add type annotation'
    >>> assert c == -1.0, \
    'Do not modify variable `c` value, just add type annotation'
"""

# Declare proper types for variables
a: ... = 1.0
b: ... = 0.0
c: ... = -1.0


Code 3.32. Solution
"""
* Assignment: Typing Basic Logic
* Complexity: easy
* Lines of code: 3 lines
* Time: 2 min

English:
    1. Declare proper types for variables
    2. Run doctests - all must succeed

Polish:
    1. Zadeklaruj odpowiedni typ zmiennych
    2. Uruchom doctesty - wszystkie muszą się powieść

Tests:
    >>> import sys; sys.tracebacklimit = 0

    >>> assert a == True, \
    'Do not modify variable `a` value, just add type annotation'
    >>> assert b == False, \
    'Do not modify variable `b` value, just add type annotation'
    >>> assert c == None, \
    'Do not modify variable `c` value, just add type annotation'
"""

# Declare proper types for variables
a: ... = True
b: ... = False
c: ... = None

Code 3.33. Solution
"""
* Assignment: Typing Basic Str
* Complexity: easy
* Lines of code: 3 lines
* Time: 2 min

English:
    1. Declare proper types for variables
    2. Run doctests - all must succeed

Polish:
    1. Zadeklaruj odpowiedni typ zmiennych
    2. Uruchom doctesty - wszystkie muszą się powieść

Tests:
    >>> import sys; sys.tracebacklimit = 0

    >>> assert a == '', \
    'Do not modify variable `a` value, just add type annotation'
    >>> assert b == 'abc', \
    'Do not modify variable `b` value, just add type annotation'
    >>> assert c == '123', \
    'Do not modify variable `c` value, just add type annotation'
"""

# Declare proper types for variables
a: ... = ''
b: ... = 'abc'
c: ... = '123'