Это не то, для чего нужны аннотации. Аннотации метаданные , а не инструкция для Python для преобразования данных.
Из Определения функций Справочная документация :
Параметры могут иметь аннотации вида «: expression
» после имени параметра. Любой параметр может иметь аннотацию даже в виде *identifier
или **identifier
. Функции могут иметь аннотацию «return» в виде «-> expression
» после списка параметров. Эти аннотации могут быть любыми допустимыми выражениями Python и оцениваются при выполнении определения функции. Аннотации могут оцениваться в другом порядке, чем они появляются в исходном коде. Наличие аннотаций не меняет семантику функции.
(выделено жирным шрифтом).
Например, платформа хинтинга типов Python использует аннотации для присоединения информации о типе к функциям для статического анализа, проверяя, что код фактически передает типы, которые, как ожидается, будут переданы.
Просто конвертируйте ваши значения явно; в вызове:
foo(str(1), str(2))
или в самой функции:
def foo(a, b):
print(str(a) + str(b))
или в декораторе:
import functools
import inspect
def typeconversion(f):
"""Converts arguments with a callable attached in the parameter annotation"""
sig = inspect.signature(f)
@functools.wraps(f)
def wrapper(*args, **kwargs):
# convert any argument (including defaults), for which there is a
# callable annotation
bound = sig.bind(*args, **kwargs)
bound.apply_defaults()
args = bound.arguments
for param in sig.parameters.values():
if param.annotation is not param.empty and callable(param.annotation):
args[param.name] = param.annotation(args[param.name])
# call the function with the converted arguments
result = f(*bound.args, **bound.kwargs)
# convert the return value
if sig.return_annotation is not sig.empty and callable(sig.return_annotation):
result = sig.return_annotation(result)
return result
return wrapper
Демо-версия:
>>> @typeconversion
... def foo(a: str, b: str) -> int:
... return a + b
...
>>> foo(42, 101)
42101