网易首页 > 网易号 > 正文 申请入驻

Python 字符串应该用双引号还是单引号?

0
分享至

△△请给“Python猫”加星标 ,以免错过文章推送

转载来源:洪尔摩斯

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语言自身

  1. Python官方文档更喜欢采用单引号。(Python 3.6: 80% vs 20%)

  2. Python标准库更喜欢采用单引号。(Python 3.6:74% vs 26%)

  3. repr() 采用单引号。

二、现实世界

  1. 很多热门开源Python项目用单引号。(无数据支持)

  2. 有些公司要求使用单引号。(无数据支持)

  3. PEP 规范里的例子更多地使用单引号。(无数据支持)

  4. Guido(Python之父)更倾向于使用单引号。(无数据支持)

  5. 有些程序员用双引号表示供人类阅读的字符串,用单引号表示供机器阅读的字符串。

三、工具

  1. 在Sublime Text里,使用双引号会导致一些高亮颜色失效。

四、易读性和易写性

  1. 使用某些字体时,单引号空字符串比双引号的空字符串更难辨认。

  2. 双引号造成更大的视觉干扰。

  3. 采用双引号就不必转义ASCII的单引号。

  4. 采用单引号就不必转义双引号。

  5. 大部分键盘布局都更容易打出单引号。(美国、中国、英国的键盘都更容易打出单引号,其他的键盘布局至少单引号和双引号需要同样次数的按键,不存在双引号更容易打的情况)

五、其他语言

  1. C语言使用双引号。

  2. 其他流行编程语言都用双引号。(如C#, Java, ...)

  3. 英语散文的引用使用双引号。

为什么说这位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很感兴趣,当然他也马上指出这个统计不完善,因为这里包含了备注和其他字符串里的引号。他要求用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看上去固执,实际上还是很关注大家的意见,并且很讲道理的。

I hope this resolves to your satisfaction what's been the most controversial issue in Black's history.

如果你觉得本文有帮助

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
领先日本37金牌!中国代表团最可怕的不是金牌,而是一批00后10后

领先日本37金牌!中国代表团最可怕的不是金牌,而是一批00后10后

娱圈办事处
2026-09-24 12:23:27
交个朋友就所售万向轮溜溜凳木板发霉等致歉:全面下架,启动退赔处理流程

交个朋友就所售万向轮溜溜凳木板发霉等致歉:全面下架,启动退赔处理流程

澎湃新闻
2026-09-25 13:44:27
王曼昱抑制日本气势!张本美和:扛不住压力,团体输了单打赢回来

王曼昱抑制日本气势!张本美和:扛不住压力,团体输了单打赢回来

排球黄金眼
2026-09-25 00:46:03
美专家向特朗普献计:不如舍弃台湾和钓鱼岛,换取中国大陆退出在两国投资,这一说法迅速引爆舆论讨论!

美专家向特朗普献计:不如舍弃台湾和钓鱼岛,换取中国大陆退出在两国投资,这一说法迅速引爆舆论讨论!

谈史论今1
2026-09-20 19:35:10
特朗普不愧是地产商出生:国宴都不忘拉着客人“看工地”

特朗普不愧是地产商出生:国宴都不忘拉着客人“看工地”

列国漫游
2026-09-25 11:25:59
从 7999 跌到 600 元!21:9 无黑边 4K 带鱼屏,床头追剧神机

从 7999 跌到 600 元!21:9 无黑边 4K 带鱼屏,床头追剧神机

小柱解说游戏
2026-09-25 05:01:26
浙江一男子中1000万大奖后偷偷给前妻70万买房,给姐姐转200万,现任妻子意外从彩票店得知真相大怒,告上丈夫!

浙江一男子中1000万大奖后偷偷给前妻70万买房,给姐姐转200万,现任妻子意外从彩票店得知真相大怒,告上丈夫!

华庭讲美食
2026-09-25 14:42:42
冲上35℃!即将升温

冲上35℃!即将升温

荆头条
2026-09-25 14:12:39
下午14点!CCTV5直播U23国足对阵泰国,安东尼奥或选择变阵

下午14点!CCTV5直播U23国足对阵泰国,安东尼奥或选择变阵

徽派体育
2026-09-25 00:02:57
声明:美国准备使用核武器保护日本和韩国

声明:美国准备使用核武器保护日本和韩国

俄罗斯卫星通讯社
2026-09-22 15:15:33
特朗普会中文的外孙女阿拉贝拉出席欢迎宴会

特朗普会中文的外孙女阿拉贝拉出席欢迎宴会

观察者网
2026-09-25 11:10:13
中央5台直播乒乓时间表:9月25日CCTV5转播国乒!王楚钦孙颖莎出战

中央5台直播乒乓时间表:9月25日CCTV5转播国乒!王楚钦孙颖莎出战

舟望停云
2026-09-25 06:52:16
52岁董卿缺席中秋诗会,开场前海报被紧急撤下,网友猜测背后原因

52岁董卿缺席中秋诗会,开场前海报被紧急撤下,网友猜测背后原因

喜欢历史的阿繁
2026-09-25 07:08:10
为什么说中美六代机竞赛中国已占先机?

为什么说中美六代机竞赛中国已占先机?

小眼睛小世界
2026-09-25 04:19:56
12306增设亲子候补不同车厢弹窗提示获赞,网友:建议增加“等待连座”选项,确保大人孩子座位相邻;12306回应

12306增设亲子候补不同车厢弹窗提示获赞,网友:建议增加“等待连座”选项,确保大人孩子座位相邻;12306回应

极目新闻
2026-09-25 14:57:09
尊界、享界、智界、尚界集体转发华为余承东微博:鸿蒙智行,未来可期!

尊界、享界、智界、尚界集体转发华为余承东微博:鸿蒙智行,未来可期!

IT之家
2026-09-24 22:19:14
配合做好笔录就可回家?北京商人遭安徽监委留置,缴纳1000万元后被控四罪

配合做好笔录就可回家?北京商人遭安徽监委留置,缴纳1000万元后被控四罪

法治边角料
2026-09-24 18:53:49
再也瞒不下去了!德国专家曾指出,中美之所以尚未爆发冲突,不是因为美国没本事,而是美国可能已经察觉到了形势的严峻

再也瞒不下去了!德国专家曾指出,中美之所以尚未爆发冲突,不是因为美国没本事,而是美国可能已经察觉到了形势的严峻

z千年历史老号
2026-09-14 17:23:40
克洛普看呆!巴萨4000万新援空门不进 遭队长狠批 获5.5分全场最低

克洛普看呆!巴萨4000万新援空门不进 遭队长狠批 获5.5分全场最低

我爱英超
2026-09-25 07:58:46
猕猴桃大量上市!发现:糖尿病吃一次猕猴桃,等于给血糖添堵?

猕猴桃大量上市!发现:糖尿病吃一次猕猴桃,等于给血糖添堵?

路医生健康科普
2026-09-25 15:45:03
2026-09-25 16:47:00
Python猫 incentive-icons
Python猫
人生苦短,我用Python。博客:https://pythoncat.top
755文章数 8122关注度
往期回顾 全部

科技要闻

华为赛力斯,一次声势浩大的权、利再分配

头条要闻

26年前为中国治沙筹款的赛考斯 出现在白宫国宴致辞中

头条要闻

26年前为中国治沙筹款的赛考斯 出现在白宫国宴致辞中

体育要闻

这场青春风暴,中国足球等了太久

娱乐要闻

肖战因拍《十日终焉》连续做半个月梦

财经要闻

月饼卖不动了...

汽车要闻

全新第四代博越L 上市限时价9.29万元起

态度原创

家居
教育
数码
本地
艺术

家居要闻

2026建博会(广州) 公装联探展交流活动

教育要闻

算了半天没算出来,是不是缺少条件啊

数码要闻

海贝RS2音乐播放器发售:R2R技术达尔文三代架构,2798元起

本地新闻

中秋逛白塔寺,体验国医妙荟雅集

艺术要闻

419米!温州第一大民企出手,“浙江第一高楼”施工新进展!

无障碍浏览 进入关怀版