Python 3.7.0 正式版發布,新特性翻譯
來自專欄 Python程序員243 人贊了文章
美國時間6月27日晚8點,Python 3.7.0 經過多輪測試,終於發布了正式版,增強了多處特性功能,同時 3.6 也更新到 3.6.6 穩定版本。
主要特性
- PEP 539,新增 CPython 中用於線程本地存儲的 C-API
- PEP 545,Python 官方文檔翻譯版本,新增日文、法文、韓文
- PEP 552,優化 pyc 文件
- PEP 553,新增內置函數
breakpoint()
,該函數在調用時自動進入調試器 - PEP 557,新增內置模塊
dataclasses
,可大幅簡化類實例屬性的初始化定義 - PEP 560,新增支持類型模塊和泛型
- PEP 562,支持在模塊定義
__getattr__
和__dir__
- PEP 563,推遲對注釋語句的分析從而優化 Python 的類型提示
- PEP 564,
time
內置函數支持納秒 - PEP 565,重新在 __main__ 中默認顯示 DeprecationWarning
- PEP 567,新增
contextvars
模塊,可實現上下文變數解決變數線程安全 - 避免使用 ASCII 作為默認文本編碼,強制 UTF-8 編碼運行
- 字典對象的 keys 按插入順序排列,現在是官方語言規範
- 多方面的顯著性能優化
dataclasses
模塊 示例
這個特性可能是 3.7.0 以後比較常用的了,是從其他語言借鑒過來的,這裡簡單演示下用法。
假如我們要封裝一個類對象,在之前我們的代碼可能要這麼寫:
class Article(object): def __init__(self, _id, author_id, title, text, tags=None, created=datetime.now(), edited=datetime.now()): self._id = _id self.author_id = author_id self.title = title self.text = text self.tags = list() if tags is None else tags self.created = created self.edited = edited if type(self.created) is str: self.created = dateutil.parser.parse(self.created) if type(self.edited) is str: self.edited = dateutil.parser.parse(self.edited) def __eq__(self, other): if not isinstance(other, self.__class__): return NotImplemented return (self._id, self.author_id) == (other._id, other.author_id) def __lt__(self, other): if not isinstance(other, self.__class__): return NotImplemented return (self._id, self.author_id) < (other._id, other.author_id) def __repr__(self): return {}(id={}, author_id={}, title={}).format( self.__class__.__name__, self._id, self.author_id, self.title)
大量的初始化屬性要定義默認值,可能還需要重寫一堆魔法方法,來實現類實例之間的排序 去重 等功能。
如果使用dataclass
進行改造,可以寫成這個樣子:
@dataclass(order=True)class Article(object): _id: int author_id: int title: str = field(compare=False) text: str = field(repr=False, compare=False) tags: List[str] = field(default=list(), repr=False, compare=False) created: datetime = field(default=datetime.now(), repr=False, compare=False) edited: datetime = field(default=datetime.now(), repr=False, compare=False) def __post_init__(self): if type(self.created) is str: self.created = dateutil.parser.parse(self.created) if type(self.edited) is str: self.edited = dateutil.parser.parse(self.edited)
可見這種語法使代碼更加簡練清晰,也更符合面向對象思想的語法方式,用過 SQLAlchemy 的同學肯定覺得很像 ORM 寫法。
上述示例只是最基礎的展示,更豐富的用法可以查看PEP 557文檔。
3.7.0 下載地址
Python Release Python 3.7.0
更多特性
What』s New In Python 3.7
推薦閱讀: