What is the best way to check if a field from a class is typing.Optional?
Example code:
from typing import Optional
import re
from dataclasses import
For reference, Python 3.8 (first released October 2019) added get_origin and get_args functions to the typing module.
Examples from the docs:
assert get_origin(Dict[str, int]) is dict
assert get_args(Dict[int, str]) == (int, str)
assert get_origin(Union[int, str]) is Union
assert get_args(Union[int, str]) == (int, str)
This will allow:
def is_optional(field):
return typing.get_origin(field) is Union and \
type(None) in typing.get_args(field)
For older Pythons, here is some compatibility code:
# Python >= 3.8
try:
from typing import Literal, get_args, get_origin
# Compatibility
except ImportError:
get_args = lambda t: getattr(t, '__args__', ()) \
if t is not Generic else Generic
get_origin = lambda t: getattr(t, '__origin__', None)