为什么不回馈' 12'? ' +' sign应该连接两个字符串,而不是添加它们。
def foo(a:str, b:str):
print(a+b)
foo(1,2)
3
答案 0 :(得分:5)
这不是注释的用途。注释是元数据,而不是Python转换数据的指令。
来自Function definitions reference documentation:
参数名称后面的参数可能带有“
: expression
”形式的注释。任何参数都可能包含*identifier
或**identifier
形式的注释。函数可以在参数列表之后具有“-> expression
”形式的“返回”注释。这些注释可以是任何有效的Python表达式,并在执行函数定义时进行评估。可以按照与源代码中出现的顺序不同的顺序评估注释。 注释的存在不会改变函数的语义。
(Bold 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):
# 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