Python 3 既是激進的又是剋制的,這些提議被否決了

導語:Python 3.8 已經發布了,引進了不少變更點。關於 3.9 預計引入的修改,也披露了一些。我們之前還關注過 GIL 的移除計劃 和 Guido 正在開發的新解析器 等話題,這意味 Python 很有活力,仍在健康地發展著。

Python 3 是比較大膽激進的,拋棄了前一版本的很多陳舊的包袱,但同時,它也是相對剋制的(一直如此),社區裡提出的很多提議都被否決了。前不久,我分享的Python 設計和歷史的 27 個問題 提到了一些沉澱下來的設計問題,今天這篇譯文則聚焦於官方明確否決掉的 24 個設計問題。

大部分問題都是細枝末節(例如大小寫、括號、反引號、行寬等等),但細究起來的話,也會挺有意思,歡迎留言討論。


PEP原文: https://www.python.org/dev/peps/pep-0399

PEP標題: Things that will Not Change in Python 3000

PEP作者: Georg Brandl

創建日期: 2006-04-04

翻譯計劃:https://github.com/chinesehuazhou/peps-cn


目錄

  • 概要
  • 語言核心
  • 內置對象
  • 標準類型
  • 編碼風格
  • 交互式解釋器
  • 版權

概要

有些想法很糟糕。儘管關於 Python 演化的某些想法具有建設性,但不少想法卻與 Python 的基本原則背道而馳,就像是讓人圍著圈跑步:哪也去不了,即使 Python 3000 允許提出特別的建議,也不管用。

此 PEP 嘗試列出 Python 3000 上所有的 BDFL 決斷,涉及那些不會發生更改的內容,以及不會引入的新功能,按主題排序,附加簡短的說明或者 python-3000 郵件列表的相關線索。

如果你認為應該實現下面所列舉的提議,那你最好立即離開計算機,出門去,盡情娛樂。去戶外活動,在草地上打盹,都比提出一個“毆打一匹死馬”的想法來得有建設性。這算是對你的警告(譯註:下面的主意是不會實現的,不要試圖改變這些已經是板上釘釘的決斷)。

語言核心

  • Python 3000 不會區分大小寫。
  • Python 3000 不會從頭開始重寫。

不會使用 C++ 或其它不同於 C 的語言作為實現語言。但是,代碼庫將逐漸遷移。Joel Spolsky 有一篇出色的文章解釋了原因:http://www.joelonsoftware.com/articles/fog0000000069.html

  • self 不會變成隱式的。

使用顯式的 self 是一個好事。消除解析變量時的歧義,可以使得代碼更清晰。這還使得函數和方法之間的差異變小。 郵件:“提議草案:Python 3.0 使用隱式的 self” https://mail.python.org/pipermail/python-dev/2006-January/059468.html

  • lambda 不會被改名。

曾經有過提議,在 Python 3000 中移除 lambda。然而,沒人能夠提出更好的提供匿名函數的方法。所以 lambda 保留了下來。但只是說要保持原樣。(有人提議)增加它對語句的支持,但這不是一個好想法。因為它需要允許多行 lambda 表達式,這意味著多行表達式可能突然出現,例如,將會允許對函數調用使用多行參數。那真是醜陋。郵件:“genexp 語法/lambda”,https://mail.python.org/pipermail/python-3000/2006-April/001042.html

  • Python 不會添加可編程的語法。

郵件:“是一個聲明!是一個函數!兩者皆是!”https://mail.python.org/pipermail/python-3000/2006-April/000286.html

  • 不會有類似 zip() 的並行迭代語法。

郵件:“並行迭代語法”,https://mail.python.org/pipermail/python-3000/2006-March/000210.html

  • 字符串將保持可迭代。

郵件:“使字符串不可迭代”,https://mail.python.org/pipermail/python-3000/2006-April/000759.html

  • 不會有對生成器表達式或列表推導式的結果進行排序的語法。sorted() 將涵蓋所有的使用情況。

郵件:“為生成器表達式添加排序”,https://mail.python.org/pipermail/python-3000/2006-April/001295.html

  • 切片和擴展型切片不會取消(即使__getslice__和__setslice__ API 可能被替換),它們也不會返回標準對象類型的視圖。

郵件:切片的未來https://mail.python.org/pipermail/python-3000/2006-May/001563.html

  • 不會禁止在循環結構內重用循環變量。

郵件:消除迭代變量的作用域出血(scope bleeding)https://mail.python.org/pipermail/python-dev/2006-May/064761.html

  • 解析器不會比 LL(1) 更復雜。

簡單勝於複雜。這個想法適用於解析器。將 Python 的語法限制為 LL(1) 解析器是一種好處,而不是詛咒。它使我們帶上手銬,不至於發展過度,不至於最終得到些時髦的語法規則,像一些走向無名的動態語言那樣,例如 Perl。

  • 不會有括號。

這太明顯了,以至於不需要引用郵件列表。使用from __future__ import braces ,你就會得到關於這個問題的明確答案。

  • 不會再有反引號。

反引號(`)將不再用作 repr 的簡寫——但這並不意味著它們可用於其它用途。即使忽略向後兼容性的混亂,這字符本身也會引起太多問題(在某些字體、某些鍵盤上、在排版書籍時,等等)。郵件:“使用反引號作為新運算符”,https://mail.python.org/pipermail/python-ideas/2007-January/000054.html

  • 引用全局變量名 foo 不會被拼寫為 globals.foo。global 語句會保留

郵件:“用全局內置對象替換 globals() 和 global 語句”,https://mail.python.org/pipermail/python-3000/2006-July/002485.html ,“顯式詞法作用域(pre-PEP?) ”,https://mail.python.org/pipermail/python-dev/2006-July/067111.html

  • 不會有替代的綁定操作符,例如 := 。

郵件:“顯式詞法作用域(pre-PEP?)”,https://mail.python.org/pipermail/python-dev/2006-July/066995.html

  • 我們不會刪除容器字面量。也就是說,{expr:expr, ...},[expr, ...] 和(expr, ...)將保留。

郵件:“去除容器字面量”,https://mail.python.org/pipermail/python-3000/2006-July/002550.html:

  • while 和 for 循環中的 else 子句不會更改語義,也不會被刪除。

郵件:“ for/except/else 語法” https://mail.python.org/pipermail/python-ideas/2009-October/006083.html

內置對象

  • zip() 不會增加關鍵字參數或其它機制來防止它在最短序列的末尾停止。

郵件:“對於不同長度的序列,令 zip() 引發異常”,https://mail.python.org/pipermail/python-3000/2006-August/003338.html

  • hash() 不會成為屬性,因為屬性應該是易於計算的,但哈希並不一定是這種情況。

郵件:“哈希作為屬性/特性”,https://mail.python.org/pipermail/python-3000/2006-April/000362.html

標準類型

  • 遍歷字典將繼續返回 key。

郵件:“遍歷字典”,https://mail.python.org/pipermail/python-3000/2006-April/000283.html郵件:讓 iter(mapping) 生成 (key, value) 對https://mail.python.org/pipermail/python-3000/2006-June/002368.html

  • 不會有 frozenlist 類型。

郵件:“不可變的列表”,https://mail.python.org/pipermail/python-3000/2006-May/002219.html

  • int 不會支持下標來生成 range。

郵件:“ xrange vs.int .__ getslice__”,https://mail.python.org/pipermail/python-3000/2006-June/002450.html

編碼風格

  • 對於 C 和 Python 代碼,(推薦的)最大行寬將保持 80 個字符。

郵件:“ C 風格指南”,https://mail.python.org/pipermail/python-3000/2006-March/000131.html

交互式解釋器

  • 解釋器提示(>>>)不會改變。它給 Guido 帶來溫暖的模糊感覺。

郵件:“低垂的果實:更改解釋器的提示?”,https://mail.python.org/pipermail/python-3000/2006-November/004891.html

本文檔已放置在公共領域。源文檔:

https://github.com/python/peps/blob/master/pep-3099.txt

譯者注

文中出現的“郵件”,原文是“thread”,英文解釋應該是:a series of connected messages on a message board on the Internet which have been sent by different people。實際指的是“郵件列表中的議題”,為簡潔起見,省譯為“郵件”。


分享到:


相關文章: