PEP 3107 - Function Annotations
PEP 526 - Syntax for Variable Annotations
https://docs.python.org/3/howto/annotations.html
Annotations Best Practices.
Najlepsze praktyki dostępu do adnotacji zależą od wersji Pythona,
ze względu na ciągły rozwój nowych narzędzi.
https://docs.python.org/3/library/inspect.html
'inspect' - Inspect live objects [Py3.5+].
There are four main kinds of services provided by this module:
type checking, getting source code, inspecting classes and functions,
and examining the interpreter stack.
inspect.get_annotations() [Py3.10+].
https://docs.python.org/3/library/typing.html
'typing' - Support for type hints [Py3.5+].
Tu jest podana lista odpowiednich PEPs.
Argumenty funkcji mogą mieć adnotacje (annotations) postaci ': expression', następującą po nazwie parametru. Podobnie może być dla parametrów postaci *identifier lub **identifier. Funkcje mogą mieć również adnotację 'return' postaci '-> expression', która następuje po liście parametrów. Jest to składnia do dołączania do funkcji dodatkowych informacji (metadata) dotyczących parametrów i wartości zwracanych. Jest to mechanizm całkowicie opcjonalny. W Pythonie 2 można było tylko w docstringu coś dopowiedzieć.
Wartości adnotacji są dostępne jako wartości słownika '__annotations__', gdzie kluczami są nazwy argumentów funkcji (string).
# Syntax. def nazwa_funkcji(arg1: wyrażenie, arg2: wyrażenie = wartość) -> wyrażenie: instrukcje def nazwa_funkcji(*arguments: wyrażenie, **keywords: wyrażenie = wartość) -> wyrażenie: instrukcje
# Adnotacje funkcji są zwykle używane jako podpowiedzi dla typów. def sum_two_numbers(a: int, b: float) -> complex: return a + b sum_two_numbers.__annotations__ # {'a': <class 'int'>, 'b': <class 'float'>, 'return': <class 'complex'>}
# https://stackoverflow.com/questions/14379753/what-does-mean-in-python-function-definitions def kinetic_energy(m:'in kg', v:'in m/s')->'Joules': return 0.5 * m * v**2 # dictionary kinetic_energy.__annotations__ # {'return': 'Joules', 'v': 'in m/s', 'm': 'in kg'}
# Podczas użycia adnotacji zmiennej lub atrybutu klasy # może wystąpić podstawienie wartości. class C: field: 'annotation' # adnotacja atrybutu klasy # Adnotacje zmiennych są zwykle używane jako podpowiedzi do typów. import typing count: int = 0 # adnotacja zmiennej i podstawienie some_list: typing.List[int] = [3, 5] some_list: list[int] = [3, 5] # Py3.9+ some_dict: typing.Dict[str, float] = {"a": 1.2} some_dict: dict[str, float] = {"a": 1.2} # Py3.9+ coords: typing.Tuple[int, float] = (12, 3.4) coords: tuple[int, float] = (12, 3.4) # Py3.9+
Podpowiedzi do typów są opcjonalne i nie są wymuszane w Pythonie. Bywają przydatne dla narzędzi do statycznej analizy typów.