网站结构形式,贵阳网站制作系统,婚纱网站模板,贵阳手机网站建设费用前言
完残#xff01;#x1f602;#xff0c;最近看之前写的 Python 代码老得琢磨这比变量的类型是啥#xff08;Python 无类型系统xxx#xff09;#xff0c;不愧是我写的#xff01;
看段之前写的实现迭代器模式的代码#xff1a; # 抽象迭代器类
class Iterator(…前言
完残最近看之前写的 Python 代码老得琢磨这比变量的类型是啥Python 无类型系统xxx不愧是我写的
看段之前写的实现迭代器模式的代码 # 抽象迭代器类
class Iterator(object):def hasNext():passdef next():pass# 抽象聚集类
class Aggregate(object):def iterator():passclass BookShelf(Aggregate):def __init__(self):self._books []self._last 0def getBookAt(self, index):return self._books[index]def appendBook(self, book):self._books.append(book)self._last self._last 1def getLength(self):return self._lastdef iterator(self):return BookShelfIterator(self)class BookShelfIterator(Iterator):def __init__(self, bookShelf):self._bookShelf bookShelfself._index 0def hasNext(self):if self._index self._bookShelf.getLength():return Trueelse:return Falsedef next(self):book self._bookShelf.getBookAt(self._index)self._index self._index 1return bookclass Book():def __init__(self, name):self._name namedef getName(self):return self._nameif __name__ __main__:bookShelf BookShelf()bookShelf.appendBook(Book(A))bookShelf.appendBook(Book(B))bookShelf.appendBook(Book(C))bookShelf.appendBook(Book(D))it bookShelf.iterator()while it.hasNext():book it.next()print(book.getName())
有一丢丢难读不通读的话会乱猜某变量类型回想之前在 PyCon China 2019 的大会资聊曾看到过类型检查相关的演讲主题回顾下演讲视频。水一波写篇文章了解下 Python 标准(PEP 3107 PEP 484 )支持的 mypy。 类型系统编译期的类型推导检查规则类型系统属于一种轻量级的形式化方法一种数学方法 使用-mypy
# 安装 mypy
pip install mypy
# 使用 mypy 做类型检查
mypy module_name.py
以下使用方式适用于 Python 3.6 及以上的版本。值得注意mypy 默认的推导类型不可为 None
变量的类型注释
integer: int 1
string: str ShanSan
err_str: str 1 # error: Incompatible types in assignment
child: bool True
# mypy 默认的推导类型不可为 None
none: int - None # error: Invalid type comment or annotationprint(integer, string)
内建类型
关于更多 mypy 的类型系统内建的类型可参考https://mypy.readthedocs.io/en/stable/builtin_types.html
from typing import Dict, Tuple, Optional, Iterable, Union
# 对于映射(Map)数据结构需要指定 key 和 value 的类型
x: Dict[str, float] {field: 2.0}# Tuple 需要指定所有元素的类型
x: Tuple[int, str, float] (3, yes, 7.5)# error: Incompatible types in assignment (expression has type Tuple[int, str, float, int], variable has type Tuple[int, str, float])
y: Tuple[int, str, float] (3, yes, 7.5, 11)op: Optional[str] None # 可为 str 或 None# 泛用可迭代对象
l: Iterable [1]
t: Iterable (1, 2)
d: Iterable {1: 1}# 可为 str 或 int
str_int1: Union[str, int] 1
str_int2: Union[str, int] ss
str_int3: Union[str, int] None # error
函数注解
from typing import NoReturndef f1() - None:passdef f2() - NoReturn: # 无返回值passdef plus(num1: int, num2: int) - int:return num1 num2# 带默认值
def plus_default(num1: int, num2: int 3) - int:return num1 num2# 容器的参数类型
def container_param(names: List[str]) - None:for name in names:print(name)
类成员注解
class MyClass:attr: int# 带默认值的实例变量charge_percent: int 100# 没有任何返回值应该注解为 Nonedef __init__(self) - None:pass# 忽略对 self 类型的注解def my_method(self, num: int, str1: str) - str:return num * str1# 支持自定义类型的注解
x: MyClass MyClass()
结尾
OK 差不多了对之前的迭代器模式的代码改造一波
from typing import List, Iterable# 抽象迭代器类
class Iterator(object):def hasNext(self):passdef next(self):pass# 抽象聚集类
class Aggregate(object):def iterator(self):passclass BookShelf(Aggregate):def __init__(self) - None:self._books: List[Book] []self._last: int 0def getBookAt(self, index: int) - Book:return self._books[index]def appendBook(self, book: Book) - None:self._books.append(book)self._last self._last 1def getLength(self) - int:return self._lastdef iterator(self) - BookShelfIterator:return BookShelfIterator(self)class BookShelfIterator(Iterator):def __init__(self, bookShelf) - None:self._bookShelf: BookShelf bookShelfself._index: int 0def hasNext(self) - bool:if self._index self._bookShelf.getLength():return Trueelse:return Falsedef next(self) - Book:book: Book self._bookShelf.getBookAt(self._index)self._index self._index 1return bookclass Book():def __init__(self, name) - None:self._name: str namedef getName(self) - str:return self._nameif __name__ __main__:bookShelf: BookShelf BookShelf()bookShelf.appendBook(Book(A))bookShelf.appendBook(Book(B))bookShelf.appendBook(Book(C))bookShelf.appendBook(Book(D))it: Iterator bookShelf.iterator()while it.hasNext():book: Book it.next()print(book.getName())
emmm, 舒服了一丢丢/(ㄒoㄒ)/~~
参考
https://github.com/python/mypyPyCon China 2019 成都分会场-刘知杭-静态类型的 Python, videoPyCon China 2019 北京分会场-依云-类型检查拯救粗心开发者, videoType hints cheat sheet (Python 3) 本文由博客群发一文多发等运营工具平台 OpenWrite 发布