Python3 函数中类型注解(Function Annotations)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yinhui_zhang/article/details/86629045

问题描述:

def read_text(path: Path, encoding=None) -> str:
    """
    Not Path.read_text for compatibility with Python 3.4.
    """
    with path.open(encoding=encoding) as f:
        return f.read()

看到这个代码时,一瞬间懵逼,这是Python3最新的函数类型注解特性,但是在网上找了一些中文资料看了之后发现一篇知乎文章(https://zhuanlan.zhihu.com/p/37239021)有个地方写错了,写道 “但同样,这些仅仅是“注解”,不会对代码产生任何影响。”,搜Python类型注解还挺排名挺高,把我害惨了,幸好我找到了官方文档【1】,建议看官方文档,故写篇博客记录一下,以防别人再犯这种低级错误。

解决方案:

其实很好理解,用 : 类型的形式指定函数的参数类型,用 -> 类型 的形式指定函数的返回值类型。Python 解释器并不会因为这些注解而提供额外的校验,没有任何的类型检查工作。也就是说,这些类型注解加不加,对你的代码来说没有任何影响。但是出现以下这种代码时:

   def load_model(self,
                   load_name: str,
                   load_epoch: int,
                   frozen_layer_count: int = 0,
                   allowed_characters_for_loaded_model: List[chr] = english_frequent_characters,
                   use_kenlm: bool = False,
                   reinitialize_trainable_loaded_layers: bool = False,
                   language_model_name_extension: str = ""):

在参数注解后还有=号,表示这个如果没有参数传入时候就会默认后面等号的值(相当于默认参数!!)。

实验证明:

定义一个函数注解的函数,其中有些参数只注解类型不带默认参数。

def foobar(a: int , b: str = 'softmax', c: float = 3.2) -> tuple:
    return a, b, c

执行如下代码:

a, b, c = foobar(a=1) 
print(a, b, c)

输出:

1 softmax 3.2

所以说如果默认参数不传参数进去的话,它会自动选择默认值。

reference:

【1】https://www.python.org/dev/peps/pep-3107/

猜你喜欢

转载自blog.csdn.net/yinhui_zhang/article/details/86629045