標籤:

Python 3.7新特性展望

昨天,Python發布了 [3.7a4](Python Release Python 3.7.0a4),按照官方發布計劃,月底Python 3.7 將迎來第一個 beta 版本,不再有新功能的添加,那麼讓我們看一下,Python 3.7到底有什麼改進呢?

新增功能

新版本中共新增了9個 PEP 標準,並沒有特別驚艷的改變,下面主要介紹一些語法和寫法上的新變化。

PEP-553 內置斷點支持

以前使用pdb的時候,需要import pdb然後pdb.set_trace(),現在使用內置的breakpoint()函數可以快速中斷。同時,breakpoint()可以使用任意的調試工具,這也方便了在調試代碼時的擴展。你可以通過PYTHONBREAKPOINT=0環境變數禁用這個功能。

PEP-562 限制訪問模塊的屬性

我們之前在編寫Python模塊時,通常無法限制使用者使用內部的屬性,比較典型的例子是在管理失效警告時。新的語法通過對模塊添加__getattr____dir__,可以實現限制訪問/提醒失效目的。

舉一個例子,假如需要失效部分方法時,我們需要在使用之前進行提醒:

# lib.pyfrom warnings import warndeprecated_names = ["old_function", ...]def _deprecated_old_function(arg, other): ...def __getattr__(name): if name in deprecated_names: warn(f"{name} is deprecated", DeprecationWarning) return globals()[f"_deprecated_{name}"] raise AttributeError(f"module {__name__} has no attribute {name}")# main.pyfrom lib import old_function # Works, but emits the warning

同樣的__dir__也可以用在類似的用途上:

# lib.pydeprecated_names = ["old_function", ...]__all__ = ["new_function_one", "new_function_two", ...]def new_function_one(arg, other): ...def new_function_two(arg, other): ...def __dir__(): return sorted(__all__ + deprecated_names)# main.pyimport libdir(lib) # prints ["new_function_one", "new_function_two", "old_function", ...]

PEP-564 支持nanosecond的時間函數

方便對nanosecond的操作,提供了6個新增的函數,分別為clock_gettime_ns()clock_settime_ns()monotonic_ns()perf_counter_ns()process_time_ns()time_ns()。基本上是在原有函數的基礎上添加_ns結尾標記,用法也基本相同。

PEP-557 數據類裝飾器

在新版本中添加了@dataclass裝飾器,利用該裝飾器可以減少數據類型定義的代碼行數。比如我們有一個類用於存儲數據:

@dataclassclass InventoryItem: Class for keeping track of an item in inventory. name: str unit_price: float quantity_on_hand: int = 0 def total_cost(self) -> float: return self.unit_price * self.quantity_on_han

使用之後,則相當於添加了以下類方法:

def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0) -> None: self.name = name self.unit_price = unit_price self.quantity_on_hand = quantity_on_handdef __repr__(self): return fInventoryItem(name={self.name!r}, unit_price={self.unit_price!r}, quantity_on_hand={self.quantity_on_hand!r})def __eq__(self, other): if other.__class__ is self.__class__: return (self.name, self.unit_price, self.quantity_on_hand) == (other.name, other.unit_price, other.quantity_on_hand) return NotImplementeddef __ne__(self, other): if other.__class__ is self.__class__: return (self.name, self.unit_price, self.quantity_on_hand) != (other.name, other.unit_price, other.quantity_on_hand) return NotImplementeddef __lt__(self, other): if other.__class__ is self.__class__: return (self.name, self.unit_price, self.quantity_on_hand) < (other.name, other.unit_price, other.quantity_on_hand) return NotImplementeddef __le__(self, other): if other.__class__ is self.__class__: return (self.name, self.unit_price, self.quantity_on_hand) <= (other.name, other.unit_price, other.quantity_on_hand) return NotImplementeddef __gt__(self, other): if other.__class__ is self.__class__: return (self.name, self.unit_price, self.quantity_on_hand) > (other.name, other.unit_price, other.quantity_on_hand) return NotImplementeddef __ge__(self, other): if other.__class__ is self.__class__: return (self.name, self.unit_price, self.quantity_on_hand) >= (other.name, other.unit_price, other.quantity_on_hand) return NotImplemented

你可以通過@dataclass(init=True, repr=True, eq=True, order=False, hash=None, frozen=False)這種形式啟用和禁用部分實現。

其他

其他的內容,PEP-538 和 PEP-540 均是關於 Python對於UTF-8環境的支持,其中538主要影響了 *nix 系統下的UTF-8字元串顯示,PEP-540主要是擴大了默認UTF-8編碼的範圍,比如sys.getfilesystemencoding()等將會返回UTF-8。這些問題一般用戶並不會遇到,因此我這裡不做更多描述,有興趣的可以去看下具體的內容即可。PEP-552擴展了pyc文件的格式,更好的支持pyc緩存,感覺作用不大,這裡也不做太多介紹。PEP-539定義了一套新的Thread Soecific Storage API,提升對跨平台的支持性,這裡也不做介紹了。

性能改進

部分Python3性能都進行了提升,不過都不如關於函數調用的改進最為明顯。通過添加LOAD_METHODCALL_METHOD兩個opcode,函數調用進行了較大提升。基本上對於2.7版本而言,大部分的性能已經超過,只有少數指標仍舊落後於Python2.7。

更多詳情

更多的詳情可以在 Python 官方網站中查詢更多信息。

推薦閱讀:

Python3.4 用 pip 安裝lxml時出現 「Unable to find vcvarsall.bat 」?
Python練習第五題,找出HTML里的正文
python3.6.0安裝pysider報錯
Windows下MySQL 5.7.17壓縮版安裝過程的坑
RabbitMQ學習心得——遠程過程調用(RPC)

TAG:Python |