问题描述:
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
所以说如果默认参数不传参数进去的话,它会自动选择默认值。