为什么选择花括号作为格式说明符
本文关键字:格式 说明符 选择 为什么 | 更新日期: 2023-09-27 18:18:00
历史好奇心与功能设计
还有另一个问题,为什么选择百分号(%)作为printf系列函数的格式说明符?但是,百分号(及其扩展)的原因肯定(?)在时间的迷雾中消失了。
无论如何,Python和c#都使用花括号语法{_}
,而不是旧的百分比语法%_
。
这些语言/特性的设计者有没有给出一个基本原理?
更一般地说,是否有理由使用两个不同的字符({
和 }
)而不是仅使用一个字符作为格式说明符?是否有理由分隔格式说明符的两边,而不是左边?
请注意,这没有询问哪个"更好"。那就太傻了。
Python是在开放环境中开发出来的。大多数大的更改都记录在pep中。因此,首先要查看的是PEP存档。PEP应该有相关邮件列表讨论和跟踪器问题的链接。
较小的更改,您可能需要搜索python-ideas和python-dev邮件列表和/或问题跟踪器,但请确保检查文档中相关的"What's New",因为有时那里有有用的链接。
任何追溯到时间迷雾(大约2.1时代)的东西都可以在Guido的Python History博客上讨论。有时你可以在源码中找到有用的信息。
无论如何,在本例中,您需要的是PEP 3101,特别是关于"替代语法"的部分,其中作者(在本例中不是语言的发明者,而是Talin)讨论了一些选择,以及每种选择的参考、优缺点。
最终,看起来并没有一个特别令人信服的理由来选择另一个;在调查了现有技术,并可能在一个邮件列表上骑自行车几周后,这个赢了。
我想我可以做出一个体面的猜测,为什么:Perl和shell以及许多其他传统的*nix东西使用${}
,带括号选项。$
对任何从Perl中逃脱的Python开发人员来说都很难看——更重要的是,它可能错误地暗示您可以在Python和Perl中使用相同的格式字符串,或者这将像Perl一样为您提供自动插值,而不是像Python那样进行显式插值。如果去掉$
,大括号显然就不再是可选的了。
对于c#,在Win32中有两种不同的格式化api,一种类似printf
,另一种基于大括号,用于i18n消息目录。大括号变体不允许使用格式说明符;你必须传递WCHAR*
字符串。类似printf
的变体不允许排序说明符;你必须按顺序传递所有参数(当你试图国际化你的消息时,这真的很糟糕,因为通常很难以一种所有参数都出现在同一个地方的方式编写一个翻译句子)。net在某种程度上融合了两者的优点。
我不了解c#,但在Python中,你可以将格式化信息放在大括号内。这使得如果没有某种结束字符就无法读取。
'The {:4.2f}th number.'.format(3.52352)
'The %4.2fth number.'.format(3.52352)
或者想象没有结尾的动态格式。
format = '4.2f'
'Number: {1:{0}}.'.format(format, 3.2524)