Python 字符串應(yīng)該用雙引號(hào)還是單引號(hào)?
共 6483字,需瀏覽 13分鐘
·
2024-04-24 08:18
轉(zhuǎn)載來源:洪爾摩斯
PyCharm升級至 2023.2版本后,經(jīng)常彈出來一個(gè)提示問我要不要試一下Black formatter。
試了一下,這個(gè)Black formatter 很有個(gè)性,特別喜歡換行。我的一個(gè)文件用PyCharm自帶的代碼整理器整理完之后是500行左右,然后再用Black整理就變成600多行了。
原來Black是Python Software Foundation主導(dǎo)的開源項(xiàng)目,Python親兒子,口號(hào)也很有個(gè)性:The uncompromising Python code formatter。
它的Uncompromising還體現(xiàn)在它github上的第118個(gè)issue,2018年提出,是一個(gè)討論了上百樓的神貼。
他們討論的問題是:字符串應(yīng)該用雙引號(hào)還是單引號(hào)。
提問者的訴求
Python的字符串既允許雙引號(hào)也允許單引號(hào),甚至允許三引號(hào)。這種靈活性自然引起群魔亂舞,特別是雙引號(hào)和單引號(hào),大家基本上有自己的喜好。然而Black毫不妥協(xié),規(guī)定只能用雙引號(hào)。
提問者bofm 手上維護(hù)著一些更喜歡用單引號(hào)的舊項(xiàng)目,他問能不能提供一個(gè)選項(xiàng)讓用戶保留單引號(hào)。
他列出了一些理由:
-
存量項(xiàng)目已經(jīng)采用單引號(hào)規(guī)則。 -
Python官方文檔例子都用單引號(hào)。 -
repr() 返回單引號(hào)。 -
很多著名項(xiàng)目都用單引號(hào) -
PEP 的例子大多數(shù)用單引號(hào)。 -
Guido(Python之父)在他最新的github commits里使用單引號(hào)。
強(qiáng)硬拒絕
他(github賬號(hào)是ambv)認(rèn)為bofm說的理由都不是理由,就相當(dāng)于說“由于其他項(xiàng)目無原則,所以Black也不應(yīng)該有原則”。這種盲從權(quán)威(an appeal to authority)的做人態(tài)度是不行的,Black是uncompromising的,絕不妥協(xié)。況且存量項(xiàng)目仍然可以用,只是可能看不慣格式化后的代碼。
慘遭封貼
這時(shí)有個(gè)人出來幫bofm說話,他說技術(shù)上很容易滿足bofm的需求,black已經(jīng)提供了每行字?jǐn)?shù)的選項(xiàng),再加一個(gè)選項(xiàng)很容易,如果官方不肯加,那就Fork一個(gè)分支自己干。
這最后一句話可能激怒了ambv,他說雖然MIT協(xié)議允許你們隨便fork單干,但在我的帖子里提到fork我會(huì)感到被冒犯,希望以后不要再提。
ambv說作為一個(gè)標(biāo)準(zhǔn)化格式化工具,太多的選擇對用戶來說反而是一個(gè)負(fù)擔(dān),也會(huì)使用戶進(jìn)一步要求更多選擇(正如上面那個(gè)人提到的,既然提供每行字?jǐn)?shù)的選項(xiàng),為什么不能再加一個(gè)選項(xiàng))。ambv 強(qiáng)調(diào)一定要標(biāo)準(zhǔn)化,反而不怎么關(guān)心究竟是雙引號(hào)還是單引號(hào)更好,反正選其中一個(gè)就行。在決定使用哪個(gè)引號(hào)之前,他曾經(jīng)和carljm和zsol 商議,他們說服了他雙引號(hào)更好,所以最終用雙引號(hào)。
ambv還反駁了在鍵盤上更容易敲打單引號(hào)的論據(jù),他認(rèn)為你喜歡打單引號(hào)就只管打,反正最后Black一鍵幫你轉(zhuǎn)成雙引號(hào),毫不費(fèi)力。
說完,ambv就暫時(shí)關(guān)閉了這個(gè)issue,說如果有更充分的理由,他會(huì)重新打開。這時(shí)距離這個(gè)帖子的誕生只過了3天。
激烈討論
盡管issue暫時(shí)被關(guān)閉,但各路人馬仍然蜂擁而至表達(dá)自己的觀點(diǎn)。其中有一位叫alanhamlett的仁兄語氣比較沖。
前面提到ambv說他咨詢過carljm和zsol的意見才選擇了雙引號(hào),alanhamlett上來就直接@zsol 問他為什么雙引號(hào)比單引號(hào)更好。ambv見到有人在自己的地盤繞開他,分明是不把他放在眼內(nèi),于是反問alanhamlett:README里的解釋還不夠嗎?
豈料alanhamlett直接開大。他說:對,那個(gè)解釋就是不夠。你應(yīng)該遵循Prettier's example 允許用戶選擇用哪個(gè)引號(hào),而不是把大量開發(fā)團(tuán)隊(duì)拒之門外。他還補(bǔ)充到,這個(gè)話題太雞毛蒜皮(bikeshedding)了,作者接受群眾意見允許選擇就完事了,婆婆媽媽干什么(婆婆媽媽是我加上去的)。
ambv當(dāng)然要馬上還擊。他提醒a(bǔ)lanhamlett注意言辭,就算你的觀點(diǎn)是對的,但你說話的方式仍然很難讓別人接受。下面是他的教訓(xùn)環(huán)節(jié):
僅僅因?yàn)槟悴煌饬硪环降挠^點(diǎn),就說一個(gè)話題幼稚,這只會(huì)令事態(tài)升級。指責(zé)我把“大量開發(fā)團(tuán)隊(duì)拒之門外”是夸張和不公平的。指導(dǎo)我們這些用愛發(fā)電的開源項(xiàng)目作者“該做什么”是很傲慢的。你是局外人,沒資格要求任何東西。
ambv總結(jié)了他的觀點(diǎn):Black是PEP 8規(guī)范的子集,定義很清晰。Black永遠(yuǎn)不會(huì)提供“使用單引號(hào)代替雙引號(hào)”的選項(xiàng),因?yàn)檫@違背了Black的標(biāo)準(zhǔn)化原則,一旦開了允許選擇的先例就無法收拾。他考慮的是是否允許“不強(qiáng)制單引號(hào)轉(zhuǎn)成雙引號(hào)”(即bofm一開始的訴求:保留單引號(hào))。他表示對此話題保持開放態(tài)度,但擔(dān)心以后越來越多豁免這豁免那的要求。這和Black的強(qiáng)迫癥原則有沖突。
這時(shí)有個(gè)叫audiolion的人火上加油。他說他曾經(jīng)很欣賞black這個(gè)項(xiàng)目,但強(qiáng)制單轉(zhuǎn)雙這點(diǎn)不能忍,如果black不改變的話,他永遠(yuǎn)不會(huì)使用black,也不會(huì)向宣傳black。他認(rèn)為沒有任何論據(jù)能夠令ambv回心轉(zhuǎn)意,但還是勸告ambv提供選擇,這樣會(huì)使大家都滿意。
如果你不改,我保證有人會(huì)fork一個(gè)版本幫你改掉,其他功能都保持一致。這不是要篡奪你的王座,只是為與你觀點(diǎn)不同的人提供一個(gè)選擇。
很奇怪,這次ambv沒有回噴,只是默默地重新打開了這個(gè)issue。這時(shí)距離帖子誕生日差不多兩個(gè)月。
觀點(diǎn)整理
這時(shí)候有個(gè)叫zestyping的重量級人物出來了。他在Hacker News那邊就參加過這個(gè)議題,現(xiàn)在跟到這邊吃瓜。他說希望貢獻(xiàn)自己的一份力量(更重要的原因是周六晚上沒事干),就把帖子里的各方觀點(diǎn)整理一遍,盡量中立地展示各種論據(jù)。他還很貼心地按照“來源”和“類別”兩個(gè)大方向組織論據(jù)。這里按類別展示:
一、Python語言自身
-
Python官方文檔更喜歡采用單引號(hào)。(Python 3.6: 80% vs 20%) -
Python標(biāo)準(zhǔn)庫更喜歡采用單引號(hào)。(Python 3.6:74% vs 26%) -
repr() 采用單引號(hào)。
二、現(xiàn)實(shí)世界
-
很多熱門開源Python項(xiàng)目用單引號(hào)。(無數(shù)據(jù)支持) -
有些公司要求使用單引號(hào)。(無數(shù)據(jù)支持) -
PEP 規(guī)范里的例子更多地使用單引號(hào)。(無數(shù)據(jù)支持) -
Guido(Python之父)更傾向于使用單引號(hào)。(無數(shù)據(jù)支持) -
有些程序員用雙引號(hào)表示供人類閱讀的字符串,用單引號(hào)表示供機(jī)器閱讀的字符串。
三、工具
-
在Sublime Text里,使用雙引號(hào)會(huì)導(dǎo)致一些高亮顏色失效。
四、易讀性和易寫性
-
使用某些字體時(shí),單引號(hào)空字符串比雙引號(hào)的空字符串更難辨認(rèn)。 -
雙引號(hào)造成更大的視覺干擾。 -
采用雙引號(hào)就不必轉(zhuǎn)義ASCII的單引號(hào)。 -
采用單引號(hào)就不必轉(zhuǎn)義雙引號(hào)。 -
大部分鍵盤布局都更容易打出單引號(hào)。(美國、中國、英國的鍵盤都更容易打出單引號(hào),其他的鍵盤布局至少單引號(hào)和雙引號(hào)需要同樣次數(shù)的按鍵,不存在雙引號(hào)更容易打的情況)
五、其他語言
-
C語言使用雙引號(hào)。 -
其他流行編程語言都用雙引號(hào)。(如C#, Java, ...) -
英語散文的引用使用雙引號(hào)。
為什么說這位zestyping是重量級人物?
因?yàn)樗麆傉硗旮鞣接^點(diǎn),ambv就來say hi。
原來zestyping之前也為Python貢獻(xiàn)過代碼,ambv的black實(shí)際上還使用了zestyping貢獻(xiàn)的lib2to3,所以ambv感謝了zestyping的貢獻(xiàn)。
感謝歸感謝,ambv還是逐條指出論據(jù)的瑕疵
Python官方文檔更“喜歡”地采用單引號(hào)。Python標(biāo)準(zhǔn)庫更多“喜歡”采用單引號(hào)。
ambv認(rèn)為這兩個(gè)論據(jù)不對。單引號(hào)是使用得更多,但官方并沒有推薦任何一種引號(hào)。ambv很肯定大部分作者都不關(guān)心使用哪種引號(hào)。
Guido更傾向于使用單引號(hào)。
ambv說他跟Guido談過心,這條也不對。Guido說他喜歡把雙引號(hào)用在給人讀的文本,把單引號(hào)用在數(shù)據(jù)上。
在Sublime Text里,使用雙引號(hào)會(huì)導(dǎo)致一些高亮顏色失效。
ambv說"This make me sad"。這明明是一個(gè)bug,應(yīng)該去修復(fù)它,怎么會(huì)成為支持單引號(hào)的論據(jù)?
雙引號(hào)造成更大的視覺干擾。
ambv懷疑這是不是由于一些字體設(shè)計(jì)得過于糟糕?!笆裁词呛饬恳曈X干擾的單位?兩種引號(hào)之間的視覺干擾數(shù)值差異有多少?就算我們能回答上述無聊的問題,我也肯定差異很少,就像M比N的干擾更大、逗號(hào)比句號(hào)的干擾更大一樣無聊?!盿mbv連珠炮般地抨擊。
zestyping 見到ambv的抗議后,改成:
-
Python官方文檔更“多”地采用單引號(hào)。 -
Python標(biāo)準(zhǔn)庫更多“多”地采用單引號(hào)。 -
Guido更“多”地使用單引號(hào)。
最終妥協(xié)
打動(dòng)ambv的似乎是一個(gè)叫kadrach的用戶做的統(tǒng)計(jì)。他統(tǒng)計(jì)了下載量最多的前100名python庫里單引號(hào)占比的分布圖,如下圖所示:
ambv很感興趣,當(dāng)然他也馬上指出這個(gè)統(tǒng)計(jì)不完善,因?yàn)檫@里包含了備注和其他字符串里的引號(hào)。他要求用AST(不知什么意思,大概是語法樹?),統(tǒng)計(jì)前1000名的庫,并且重復(fù)的文件只統(tǒng)計(jì)一次。
ambv和kadrach就這個(gè)統(tǒng)計(jì)的實(shí)現(xiàn)方法討論了很久,在這過程中ambv的立場似乎逐步軟化(雖然我沒看到有什么統(tǒng)計(jì)成果)。
這時(shí)一個(gè)叫kbd的用戶做結(jié)案陳詞:縱觀整個(gè)帖子,最重要的論據(jù)是很多人(包括Python之父)都使用不同的引號(hào)來表示不同的意思,雙引號(hào)表示“人類可讀的文本”,單引號(hào)表示“數(shù)據(jù)”。kbd說檢查了自己的代碼,發(fā)現(xiàn)自己下意識(shí)地也遵循了這種規(guī)范,所以這種潛意識(shí)可能是普遍現(xiàn)象。
ambv馬上表示同意,他認(rèn)為這也是最有說服力的論據(jù)。這一天是2018年5月30日。
在幾個(gè)人附議之后,ambv在5月31日發(fā)布了18.6b0版本,終于提供了 --skip-string-normalization 選項(xiàng)。
這個(gè)issue是4月9日提出的,4月12日被關(guān)閉,5月27日重開,5月31日解決。
ambv看上去固執(zhí),實(shí)際上還是很關(guān)注大家的意見,并且很講道理的。
I hope this resolves to your satisfaction what's been the most controversial issue in Black's history.
最后推薦一下我們團(tuán)隊(duì)寫的量化小冊的內(nèi)容,45篇內(nèi)容!從Python安裝,入門,數(shù)據(jù)分析,爬取股票基金的歷史+實(shí)時(shí)數(shù)據(jù),以及如何寫一個(gè)簡單量化策略,策略回測,如何看資金曲線統(tǒng)統(tǒng)都有介紹!非常超值!
歡迎訂閱:原價(jià)199 早鳥價(jià)2杯咖啡錢,即可永久閱讀。滿400人又要漲價(jià)了,現(xiàn)在的價(jià)格非常非常低,只要2杯奶茶,就可以終身訂閱+課程源碼,還有永久陪伴群。48小時(shí)無理由退款,放心食用!
往期推薦
量化: 如何用Python爬取創(chuàng)業(yè)板歷史+實(shí)時(shí)股票數(shù)據(jù)!|實(shí)戰(zhàn)股票分析篇利用Pandas 9招挖掘五糧液股價(jià)!|實(shí)戰(zhàn)股票數(shù)據(jù)分析篇 Pandas滾動(dòng)操作 |量化股票第一步,用Python畫股票K線,雙均線圖,可視化你的股票數(shù)據(jù)!|如何用Python爬取全部800多只ETF基金數(shù)據(jù)!|如何用Python寫一個(gè)雙均線策略 |如何用Python開發(fā)一個(gè)多策略機(jī)器人!上篇!|Python量化系列-用布林策略買五糧液能賺多少錢?|只要4秒鐘!用Python 獲取上證指數(shù)34年的歷史日線數(shù)據(jù)!
入門: 最全的零基礎(chǔ)學(xué)Python的問題 | 零基礎(chǔ)學(xué)了8個(gè)月的Python | 實(shí)戰(zhàn)項(xiàng)目 |學(xué)Python就是這條捷徑
干貨:爬取豆瓣短評,電影《后來的我們》 | 38年NBA最佳球員分析 | 從萬眾期待到口碑撲街!唐探3令人失望 | 笑看新倚天屠龍記 | 燈謎答題王 |用Python做個(gè)海量小姐姐素描圖 |碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影
趣味:彈球游戲 | 九宮格 | 漂亮的花 | 兩百行Python《天天酷跑》游戲!
AI: 會(huì)做詩的機(jī)器人 | 給圖片上色 | 預(yù)測收入 | 碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影
小工具: Pdf轉(zhuǎn)Word,輕松搞定表格和水印! | 一鍵把html網(wǎng)頁保存為pdf!| 再見PDF提取收費(fèi)! | 用90行代碼打造最強(qiáng)PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換 | 制作一款釘釘?shù)蛢r(jià)機(jī)票提示器! |60行代碼做了一個(gè)語音壁紙切換器天天看小姐姐!|
