Python 3.7.0 正式版發布,新特性翻譯

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?

www.python.org圖標

更多特性

What』s New In Python 3.7?

docs.python.org


推薦閱讀:

TAG:Python | 編程 | 爬蟲計算機網路 |