當前位置:
首頁 > 知識 > Python的發展狀況-2018年

Python的發展狀況-2018年

Python的發展狀況-2018年

這個月早些時候我在加拿大PyCon的演講讓我興奮不已,在會議期間,我與許多聰明人交談,似乎每個人都在談論著同樣的希望和痛苦。 這是一個試圖將社區中微弱的耳語合成一個單一的有凝聚力的帖子。

我愛Python。到目前為止,我在個人項目和專業項目中使用Python已經差不多10年了。我的工作是等量數據分析和快速原型設計,所以,Python很自然地成為一個很好的選擇。Python最大的吸引人的地方就是,它有包含了幾乎所有的庫:機器學習,數據分析,重現性研究,可視化,雲計算,Web API和控制項。

這是一個令人驚異的團體,和他們在StackOverflow和GitHub上進行在線交互通常是一種樂趣,所以我決定回來。2015年,我的一個朋友正在我們學校組織加拿大PyCon,並把我拉進了志願者行列。我發現這個社區的人都很友好,而且非常有創意(那些想要使用Python描述木頭結構特徵的人???)。今年,我想我應該回報一些,於是在我的家鄉多倫多的PyCon上做了一次演講。我被這個社區在短短3年里的發展所震驚。當我被告知我將在「舞廳」演講時,我以為那只是一個房間的名字,結果比那要大一點。

和以前一樣,我發現這個社區充滿了聰明而有創造力的人。關於《專橫的聲音:用Python揭露哈利波特中的性別偏見》的討論就是一個很好的例子,(不考慮你對這個主題的看法),這是一個滑稽而引人注目的標題。

然而,與任何工程的工作一樣,Python是一個正在進行的工作。今天我們對語言的理解甚至和五年前都不一樣了,所以那些在當時看起來很奇怪的事情現在不僅是可能的,而且是合乎邏輯的。在這篇文章中,我想闡述我認為對這個社區有前途的發展方向,以及我希望看到它如何發展。

優點

許多好的項目要麼在2018年著陸Python大陸,要麼克服了它們發展的困難。以下是我最喜歡的:

JupyterLab

Jupyter筆記本是一個web應用程序,它可以在線執行Python(和其他語言)並查看結果,包括圖形、經過修飾的表和標記格式的散文。它還自動保存即時結果 (類似於一個REPL),允許導出多種格式,並且還有上百個其他特性。想要更深入的了解,請參閱我的PyCon談話。Jupyter筆記本在社區中應用非常廣泛,尤其是在科研領域。Jupyter團隊理所當然地獲得了2017年的ACM軟體系統獎。

Jupyterlab是對傳統Jupyter筆記本的一個令人興奮的改進版。它包括一些引人注目的特性,如單元格拖放、數據文件的內聯查看(像 CSV)、選項卡環境和一個更加以命令為中心的介面。它仍然感覺像是一個測試版,在Reveal.js幻燈片導出功能和單元格崩潰方面有一些小毛病,並不像預期的那樣工作。但總的來說,它是一個好工具變得越來越好,越來越適合用戶的複雜程度的完美例子。

Mypy

mypy是Python的一個靜態類型檢查工具,已經存在了一段時間。但是,它在今年變得非常好,甚至於你可以將它集成到你的生產項目中,作為git鉤子或其他CI流程的一部分。我發現它是對所有代碼庫的一個極其有用的補充,可以在我編寫一行測試代碼之前發現絕大多數錯誤。然而,這並非沒有缺陷。在許多情況下,必須進行注釋這讓人感覺很麻煩,

__init__ (self, *args) -> None

以及其他我認為奇怪的地方。許多常用模塊的類型庫文件很缺乏,比如:

* flask

* msopack

* coloredlogs

* flask-restplus

* sqlalchemy

* nacl

在沒有進行有效配置的情況下將其集成到你的CI系統中仍然是一個問題。-- ignore-missing-imports選項基本上是強制的。在將來,我希望它成為一個社區標準,為所有打算作為庫的模塊提供類型庫文件。

Pipfile and pipenv

我真的很喜歡Pipfiles! Pipfiles實現了PEP508,這促使它替代了Python的依賴管理系統requirements.txt。

最頂層的動機是,和其他語言(如rust和javascript)的管理系統相比,使用 pip的依賴管理系統感覺要陳舊。而pip/requirement.txt 的缺陷在社區中似乎人盡皆知,本文是我見過的唯一一篇對其缺陷進行列舉的文章,而且比較貼近實際。我推薦你閱讀一下,但是它太長了還是不要去讀:

還沒有關於requirements.txt的相應標準來具體說明它只是列出所有主要和次要的依賴項,還是有具體嚴格的要求?它包括固定的版本嗎?另外,單獨將開發環境需求分離出來是非常特別的做法。不同的小組開發不同的部分,所需要的環境需求也不一樣,這樣一來不利於軟體的可再生構建。

保持依賴關係列表的最新需要先執行pip install $package,其次是pip freeze > requirements.txt, 這是一個非常笨拙的工作流,有很多問題。

開發管理生態系統由三個工具和標準(virtualenv、pip和requtrements .txt)組成,它們之間沒有清晰的交互關係。既然你試圖完成一項任務,為什麼沒有一種工具可以提供幫助呢?

進入pipenv。

Pipenv自動創建一個虛擬環境,在這個虛擬環境中安裝和管理依賴關係,並保持Pipfile的更新。

雖然這個想法很好,但是使用它非常麻煩。在實際使用中,我遇到了很多問題,常常不得不回頭使用以前的處理方法——例如使用顯式的虛擬環境。我還發現鎖定非常慢(部分問題源於setup.py標準,它是工具生態系統中許多其他問題的根源)。

f-strings

f-strings太棒了!許多人都寫過關於f-strings優點的文章,從它們的自然語法到它們帶來的性能改進。我覺得沒有必要重複這些觀點,我只想說這是一個神奇的功能,自從它們發布後我就一直在使用。

但它引入的一個麻煩就是是編寫print語句和logging語句之間的不一致。logging模塊很棒,當關閉日誌消息時,默認是不會格式化字元串。所以你可以這樣寫:


x = 3

logging.debug(『x=%d』,x)

如果將日誌級別設置為DEBUG,則輸出x=3,但如果將日誌級別設置為更高,則甚至不會執行字元串插值。

這是因為logging.debug是一個函數,字元串作為參數傳遞。你可以在易讀的C源代碼中看到它是如何工作的。但是,如果你編寫以下代碼,這個功能就會消失:


x=3

1ogging.debug (f"x={x}")

無論日誌級別如何,字元串插值都會發生。這在語言層面上是有意義的,但是在我的工作流程中實際的結果卻是令人惱火的。調試代碼時,我首先編寫print語句,當一切正常時,我隨後將它們轉換為logging語句。因此,每個列印語句必須手工重寫,以適應不同類型的字元串插值。我不知道如何解決這個問題,但我想把它指出來,因為我還沒有看到其他人寫過這個問題。

缺點

對於其他和Python一樣久存在的項目 (哇,它和我一樣古老),有一些模塊和思想正在顯示它們的年齡。這並不是一場歷史發掘比賽,但是通過解決挑戰,我們可以說我們作為一個社區可以做得更好。

tox

Tox仍然是python大陸中最好的(或者更準確地說,實際上是最好的)測試運行程序,但是它非常糟糕。不僅tox.ini的語法文件有點不直觀,工具也非常慢。這不是tox的錯,整個setup.py系統設計就是有問題的。因為這些文件聲明包依賴關係,同時可以執行代碼,發現依賴關係本質上是緩慢的。這導致許多工具運行緩慢。我相信這是我們作為一個社區在2019年應該解決的問題。

另外,目前還沒有Pipfile支持,這使得使用它的價值主張大大降低。與所有事情一樣,重要的不是這個想法有多好,而是圍繞它的工具支持。

類型注釋僅適用於工具

引用自 PEPO484:

使用類型提示進行性能優化留給讀者自行練習。

考慮到編寫PEP時Python的狀態,這是可以理解的,但是現在是時候繼續了。我們已經成功地轉換到Python3,並且PyPi上最常下載包中的359 /360個包也已經兼容Python3。類型提示包已經存在了,並且深受社區喜愛。更進一步,Python類型提示應該帶來額外的好處,比如性能優化和自動運行時類型斷言。我發現運行時類型斷言非常有用(特別是在庫中),而且手動寫起來很麻煩。對於類型提示,這尤其令人討厭,因為你必須維護多個類型真源。

正如其他人所寫的,Python 4可能將JIT作為一級特性。這似乎是提出一個邏輯位置來添加性能優化,以此作為對類型注釋的響應。

變數可變性

我現在對Python最大的抱怨之一是缺少const或類似的東西。在我編寫代碼時所犯的所有錯誤中,有固定90%都可以追溯到與類型相關的錯誤(現在我的程序主要出現此錯誤)或當我認為我在創建一個新變數時,在同一個函數中意外地重用以前的變數的錯誤。我知道有處理這些的包,但是我想讓const成為首選。

nbconvert

nbconvert項目總的來說是令人驚嘆的。它允許Jupyter筆記本轉換成其他各種格式,包括PDF,Reveal.js幻燈片,或可執行腳本。在過去的幾個月里,我廣泛地使用了最後兩種方法,它們確實改變了我的工作流程。我可以把Jupyter筆記本整理在一起,然後在最後一刻把它們轉換成每周和同事開會用的報告,來展示我的進步。同樣,我可以在notebook中開發一個想法,然後將其轉換為腳本,並以最小的更改將其用於生產環境。

不管怎樣,這就是我的想法。實際情況是,從任何一個大型筆記本中生成的腳本都需要大量的手工轉換,因此使用剪切粘貼從頭開始編寫腳本是值得的。我從一些公司聽說,他們已經圍繞nbconvert創建了一些包裝程序,使之更加實用。我鼓勵這些人開源這些貢獻,哪怕只是為了減輕我個人的痛苦。

結論

許多優秀的人鼓勵我寫這篇文章,我感謝他們的反饋和支持。如果你不同意,請隨時在Iwitter上給我留言。如果你感受到我的痛苦,請在Hacker News討論區留下你的不滿故事。

腳註

這些只是我上個月用過的。肯定還有更多完整的列表,例如typeshed type-stubs-request標記。


英文原文:https://qiniumedia.freelycode.com/vcdn/1/優質文章長圖2/state_of_python_in_2018.pdf
譯者:一瞬

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

Pipenv:吹噓自己無所不能,實際上沒什麼卵用
用Python在抖音扒了這些高顏值女神後,突然成了人生贏家

TAG:Python部落 |