Python字符串應該用雙引號還是單引號?

數據智能相依偎 2024-04-14 07:11:09

轉載來源:洪爾摩斯

PyCharm升級至 2023.2版本後,經常彈出來一個提示問我要不要試一下Black formatter。

試了一下,這個Black formatter 很有個性,特別喜歡換行。我的一個文件用PyCharm自帶的代碼整理器整理完之後是500行左右,然後再用Black整理就變成600多行了。

原來Black是Python Software Foundation主導的開源項目,Python親兒子,口號也很有個性:The uncompromising Python code formatter。

它的Uncompromising還體現在它github上的第118個issue,2018年提出,是一個討論了上百樓的神貼。

他們討論的問題是:字符串應該用雙引號還是單引號。

提問者的訴求

Python的字符串既允許雙引號也允許單引號,甚至允許三引號。這種靈活性自然引起群魔亂舞,特別是雙引號和單引號,大家基本上有自己的喜好。然而Black毫不妥協,規定只能用雙引號。

提問者bofm 手上維護著一些更喜歡用單引號的舊項目,他問能不能提供一個選項讓用戶保留單引號。

他列出了一些理由:

存量項目已經采用單引號規則。Python官方文檔例子都用單引號。repr() 返回單引號。很多著名項目都用單引號PEP 的例子大多數用單引號。Guido(Python之父)在他最新的github commits裏使用單引號。

強硬拒絕

事實上,作者還未出來,另外一個用戶就已經點滅這個issue,他說Black的優點就是消滅掉這些雞毛蒜皮的選擇。接著Black的第一作者出來了。這位第一作者Lukasz Langa 是大神,Python核心團隊成員,波蘭人,鋼琴家。

他(github賬號是ambv)認爲bofm說的理由都不是理由,就相當于說“由于其他項目無原則,所以Black也不應該有原則”。這種盲從權威(an appeal to authority)的做人態度是不行的,Black是uncompromising的,絕不妥協。況且存量項目仍然可以用,只是可能看不慣格式化後的代碼。

慘遭封貼

這時有個人出來幫bofm說話,他說技術上很容易滿足bofm的需求,black已經提供了每行字數的選項,再加一個選項很容易,如果官方不肯加,那就Fork一個分支自己幹。

這最後一句話可能激怒了ambv,他說雖然MIT協議允許你們隨便fork單幹,但在我的帖子裏提到fork我會感到被冒犯,希望以後不要再提。

ambv說作爲一個標准化格式化工具,太多的選擇對用戶來說反而是一個負擔,也會使用戶進一步要求更多選擇(正如上面那個人提到的,既然提供每行字數的選項,爲什麽不能再加一個選項)。ambv 強調一定要標准化,反而不怎麽關心究竟是雙引號還是單引號更好,反正選其中一個就行。在決定使用哪個引號之前,他曾經和carljm和zsol 商議,他們說服了他雙引號更好,所以最終用雙引號。

ambv還反駁了在鍵盤上更容易敲打單引號的論據,他認爲你喜歡打單引號就只管打,反正最後Black一鍵幫你轉成雙引號,毫不費力。

說完,ambv就暫時關閉了這個issue,說如果有更充分的理由,他會重新打開。這時距離這個帖子的誕生只過了3天。

激烈討論

盡管issue暫時被關閉,但各路人馬仍然蜂擁而至表達自己的觀點。其中有一位叫alanhamlett的仁兄語氣比較沖。

前面提到ambv說他咨詢過carljm和zsol的意見才選擇了雙引號,alanhamlett上來就直接@zsol 問他爲什麽雙引號比單引號更好。ambv見到有人在自己的地盤繞開他,分明是不把他放在眼內,于是反問alanhamlett:README裏的解釋還不夠嗎?

豈料alanhamlett直接開大。他說:對,那個解釋就是不夠。你應該遵循Prettier's example 允許用戶選擇用哪個引號,而不是把大量開發團隊拒之門外。他還補充到,這個話題太雞毛蒜皮(bikeshedding)了,作者接受群衆意見允許選擇就完事了,婆婆媽媽幹什麽(婆婆媽媽是我加上去的)。

ambv當然要馬上還擊。他提醒alanhamlett注意言辭,就算你的觀點是對的,但你說話的方式仍然很難讓別人接受。下面是他的教訓環節:

僅僅因爲你不同意另一方的觀點,就說一個話題幼稚,這只會令事態升級。指責我把“大量開發團隊拒之門外”是誇張和不公平的。指導我們這些用愛發電的開源項目作者“該做什麽”是很傲慢的。你是局外人,沒資格要求任何東西。

ambv總結了他的觀點:Black是PEP 8規範的子集,定義很清晰。Black永遠不會提供“使用單引號代替雙引號”的選項,因爲這違背了Black的標准化原則,一旦開了允許選擇的先例就無法收拾。他考慮的是是否允許“不強制單引號轉成雙引號”(即bofm一開始的訴求:保留單引號)。他表示對此話題保持開放態度,但擔心以後越來越多豁免這豁免那的要求。這和Black的強迫症原則有沖突。

這時有個叫audiolion的人火上加油。他說他曾經很欣賞black這個項目,但強制單轉雙這點不能忍,如果black不改變的話,他永遠不會使用black,也不會向宣傳black。他認爲沒有任何論據能夠令ambv回心轉意,但還是勸告ambv提供選擇,這樣會使大家都滿意。

如果你不改,我保證有人會fork一個版本幫你改掉,其他功能都保持一致。這不是要篡奪你的王座,只是爲與你觀點不同的人提供一個選擇。

很奇怪,這次ambv沒有回噴,只是默默地重新打開了這個issue。這時距離帖子誕生日差不多兩個月。

觀點整理

這時候有個叫zestyping的重量級人物出來了。他在Hacker News那邊就參加過這個議題,現在跟到這邊吃瓜。他說希望貢獻自己的一份力量(更重要的原因是周六晚上沒事幹),就把帖子裏的各方觀點整理一遍,盡量中立地展示各種論據。他還很貼心地按照“來源”和“類別”兩個大方向組織論據。這裏按類別展示:

一、Python語言自身

Python官方文檔更喜歡采用單引號。(Python 3.6: 80% vs 20%)Python標准庫更喜歡采用單引號。(Python 3.6:74% vs 26%)repr() 采用單引號。

二、現實世界

很多熱門開源Python項目用單引號。(無數據支持)有些公司要求使用單引號。(無數據支持)PEP 規範裏的例子更多地使用單引號。(無數據支持)Guido(Python之父)更傾向于使用單引號。(無數據支持)有些程序員用雙引號表示供人類閱讀的字符串,用單引號表示供機器閱讀的字符串。

三、工具

在Sublime Text裏,使用雙引號會導致一些高亮顔色失效。

四、易讀性和易寫性

使用某些字體時,單引號空字符串比雙引號的空字符串更難辨認。雙引號造成更大的視覺幹擾。采用雙引號就不必轉義ASCII的單引號。采用單引號就不必轉義雙引號。大部分鍵盤布局都更容易打出單引號。(美國、中國、英國的鍵盤都更容易打出單引號,其他的鍵盤布局至少單引號和雙引號需要同樣次數的按鍵,不存在雙引號更容易打的情況)

五、其他語言

C語言使用雙引號。其他流行編程語言都用雙引號。(如C#, Java, ...)英語散文的引用使用雙引號。

爲什麽說這位zestyping是重量級人物?

因爲他剛整理完各方觀點,ambv就來say hi。

原來zestyping之前也爲Python貢獻過代碼,ambv的black實際上還使用了zestyping貢獻的lib2to3,所以ambv感謝了zestyping的貢獻。

感謝歸感謝,ambv還是逐條指出論據的瑕疵

Python官方文檔更“喜歡”地采用單引號。Python標准庫更多“喜歡”采用單引號。

ambv認爲這兩個論據不對。單引號是使用得更多,但官方並沒有推薦任何一種引號。ambv很肯定大部分作者都不關心使用哪種引號。

Guido更傾向于使用單引號。

ambv說他跟Guido談過心,這條也不對。Guido說他喜歡把雙引號用在給人讀的文本,把單引號用在數據上。

在Sublime Text裏,使用雙引號會導致一些高亮顔色失效。

ambv說"This make me sad"。這明明是一個bug,應該去修複它,怎麽會成爲支持單引號的論據?

雙引號造成更大的視覺幹擾。

ambv懷疑這是不是由于一些字體設計得過于糟糕。“什麽是衡量視覺幹擾的單位?兩種引號之間的視覺幹擾數值差異有多少?就算我們能回答上述無聊的問題,我也肯定差異很少,就像M比N的幹擾更大、逗號比句號的幹擾更大一樣無聊。”ambv連珠炮般地抨擊。

zestyping 見到ambv的抗議後,改成:

Python官方文檔更“多”地采用單引號。Python標准庫更多“多”地采用單引號。Guido更“多”地使用單引號。

最終妥協

打動ambv的似乎是一個叫kadrach的用戶做的統計。他統計了下載量最多的前100名python庫裏單引號占比的分布圖,如下圖所示:

ambv很感興趣,當然他也馬上指出這個統計不完善,因爲這裏包含了備注和其他字符串裏的引號。他要求用AST(不知什麽意思,大概是語法樹?),統計前1000名的庫,並且重複的文件只統計一次。

ambv和kadrach就這個統計的實現方法討論了很久,在這過程中ambv的立場似乎逐步軟化(雖然我沒看到有什麽統計成果)。

這時一個叫kbd的用戶做結案陳詞:縱觀整個帖子,最重要的論據是很多人(包括Python之父)都使用不同的引號來表示不同的意思,雙引號表示“人類可讀的文本”,單引號表示“數據”。kbd說檢查了自己的代碼,發現自己下意識地也遵循了這種規範,所以這種潛意識可能是普遍現象。

ambv馬上表示同意,他認爲這也是最有說服力的論據。這一天是2018年5月30日。

在幾個人附議之後,ambv在5月31日發布了18.6b0版本,終于提供了 --skip-string-normalization 選項。

這個issue是4月9日提出的,4月12日被關閉,5月27日重開,5月31日解決。

ambv看上去固執,實際上還是很關注大家的意見,並且很講道理的。

0 阅读:0

數據智能相依偎

簡介:感謝大家的關注