Static Type Checking Example
Demonstration of the interaction between static and dynamic type validation.
Tip
To see this example in action, download it from
static_type_checking
and run:
$ python static_type_checking.py
Example Atom Code
# --------------------------------------------------------------------------------------
# Copyright (c) 2022, Nucleic Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file LICENSE, distributed with this software.
# --------------------------------------------------------------------------------------
"""Demonstration of the interaction between static and dynamic type validation."""
from typing import List, Optional
from atom.api import Atom, Int
class MyAtom(Atom):
"""Simple atom typing example."""
s: str = "Hello"
lst: List[int] = [1, 2, 3] # On Python >= 3.9 list[int] can be used
num: Optional[float]
n = Int()
my_atom = MyAtom()
assert my_atom.n == 0
# Optional values have a default value of None if no default is specified
assert my_atom.num is None
# Mutable default values for lists and dicts are OK
assert my_atom.lst == [1, 2, 3]
# The following statements will fail static type checking and
# Atom will raise runtime TypeError exceptions.
# (the type ignore comment allow CI to pass)
try:
my_atom.n = "Not an integer" # type: ignore
except TypeError as e:
print(f"Invalid value for member 'n' of {my_atom}.\n", e)
try:
my_atom.s = 5 # type: ignore
except TypeError as e:
print(f"Invalid value for member 's' of {my_atom}.\n", e)