函数参数dtype声明不起作用?

时间:2018-04-28 18:21:46

标签: python python-3.x function annotations

为什么不回馈' 12'? ' +' sign应该连接两个字符串,而不是添加它们。

def foo(a:str, b:str):
    print(a+b)
foo(1,2)
3

1 个答案:

答案 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