众所周知,python
是一种动态类型语言,但是,从v3.6
版本开始,开始支持静态类型的写法。
了解python
的静态类型,有助于我们封装更加可靠和易于维护的工具和库。
动态和静态类型本来是区分语言种类的一个指标,
动态和静态语言各有优势和适用的场景,不能说那个一定比另一个好。
选择静态类型或动态类型语言应根据具体的需求和情况进行权衡和评估。
在实际开发中,也可以根据项目的需要选择不同的语言进行组合使用,以充分发挥各语言的优势。
动态语言的优势主要有:
动态语言的劣势主要有:
静态类型语言的优势主要有:
静态类型语言的劣势主要有:
根据经验,一般偏底层或算法的应用会用静态语音来编写,偏应用层或者脚本的应用会用动态语言来编写。
如今,python可以支持静态类型的方式来编写代码,必然能够让它的应用范围进一步扩大。
变量定义:python
复制代码variable_name: type
复合类型:python
复制代码from typing import Dict, List, Tuple
函数定义:python
复制代码def function_name(param: type)-> return_type:
一般变量示例:python
复制代码i: int = 1
s: str= "abc"
print(i, s)
#运行结果:
1 abc
复合类型示例:python
复制代码from typing import Dict, List, Tuple
numbers: List[int] = [1, 2, 3, 4, 5, 100]
numbers_dict: Dict[str, int] = {
"one": 1,
"two": 2,
"three": 3,
"four": 4,
"five": 5,
"hundred": 100,
}
multi_type_tuple: Tuple[str, int, bool] = ("one", 1, False)
print(numbers)
print(numbers_dict)
print(multi_type_tuple)
#运行结果:
[1, 2, 3, 4, 5, 100]
{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'hundred': 100}
('one', 1, False)
函数示例:python
复制代码def sum(a: int, b: int) -> int:
return a + b
print(sum(10, 20))
#运行结果:
30
python
本质上毕竟还是动态语言,虽然支持按照静态类型的语法写代码,
但是代码执行时还是以动态类型的方式去运行的。
比如下面的示例(test.py
):python
复制代码def sum(a: int, b: int) -> int:
return a + b
print(sum(10, 20))
print(sum("10", "20")) # 你的IDE也许会提示类型错误, 但是仍然可以执行
#运行结果:
30
1020
上面的代码也许会提示类型错误(根据你的IDE配置情况来看),
但是执行还是可以执行,这样,我们静态类型的写法就没有意义了。
我们的原意是希望像静态类型语言一样,在实际执行前检查类型是否合法。
这时,我们可以使用mypy
工具来检查我们代码中的类型情况。bash
复制代码pip install mypy
简单封装一个检查类型的脚本(check_run.py
):python
复制代码import subprocess
import sys
def type_check(script):
output = subprocess.run(['mypy', script], stdout=subprocess.PIPE).stdout
return output.decode('utf-8')
def run(script):
output = subprocess.run(['python3.6', script])
if __name__ == '__main__':
script = sys.argv[1]
mypy_output = type_check(script)
if mypy_output != '':
print(mypy_output)
else:
run(script)
用上面的 test.py
作为测试脚本,默认执行:bash
复制代码$ python ./test.py
30
1020
加上检查类型的功能,mypy
会帮助我们检查出来代码中的类型问题:bash
复制代码$ python check_run.py test.py
test.py:9: error: Argument 1 to "sum" has incompatible type "str"; expected "int" [arg-type]
test.py:9: error: Argument 2 to "sum" has incompatible type "str"; expected "int" [arg-type]
Found 2 errors in 1 file (checked 1 source file)
python
中加入静态类型,让我们写代码时多了一个选择,并不是一定要用这种静态类型的写法。
我们之前使用python
的方式仍然有效的。
我想,主要原因还是在于python
中已经应用在很多严谨的数值计算方面,
特别是在人工智能兴起之后,python
也随之大放异彩,逐渐渗透到一些底层的场景中。
这时,对python
的稳定性和可维护性的要求远远大于其易用性了,所以,才会开始支持这种静态类型语言的写法。