这不是注释的用途。批注是
元数据
,而不是Python转换数据的指令。
从
Function definitions
reference documentation
:
参数可能有如下形式的注释
: expression
在参数名称之后。任何参数都可以有注释,即使是表单的注释
*identifier
或
**identifier
.函数可能具有表单的返回注释
-> expression
参数列表之后。这些注释可以是任何有效的Python表达式,并在执行函数定义时进行计算。注释的计算顺序可能与它们在源代码中的显示顺序不同。
注释的存在不会改变函数的语义。
(加粗emphisis mine)。
例如
Python type hinting framework
使用注释将类型信息附加到用于静态分析的函数,验证代码是否实际传入了预期传入的类型。
只需显式转换您的值;在通话中:
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):
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])
result = f(*bound.args, **bound.kwargs)
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