为什么为格式说明符选择花括号?

时间:2014-08-14 21:49:11

标签: c# python string-formatting history delimiter

历史好奇心和特色设计

还有另外一个问题,Why was the percent sign (%) chosen as the format specifier for the printf family of functions?但是百分号(和it's extensions)的原因肯定会在时间的迷雾中丢失。

无论如何,PythonC#都使用Curly Brace语法{_}而不是旧语法%_

这些语言/功能的设计师是否曾为此提供理由?

更一般地说,有没有理由使用两个不同的字符({ })而不是格式说明符只有一个字符?是否有理由分隔格式说明符的两边,而不仅仅是左侧?

请注意,询问“哪个更好”。那太傻了。

2 个答案:

答案 0 :(得分:2)

Python是公开开发的。 PEPs中记录了大多数重大更改。因此,首先要看的是PEP档案。 PEP应该链接到相关的邮件列表讨论和跟踪器问题。

更改较小,您可能需要搜索python-ideas和python-dev邮件列表和/或问题跟踪器......但请务必查看相关的"新功能"在文档中,因为有时在那里有一个有用的链接。

可以在Guido的Python History博客上讨论任何可以追溯到时间迷雾(2.1时代左右)的事情。有时您可以在源代码中找到有用的信息。

无论如何,在这种情况下,它是你想要的PEP 3101,特别是" Alternate Syntax"中的部分,其中作者(在这种情况下不是语言发明者,但Talin)讨论了每种选择,参考,优点和缺点。

最终,看起来没有一个选择优于另一个选择的特别令人信服的理由;在对现有技术进行调查之后,并且可能在其中一个邮件列表上对其进行了数周的折磨,这一次获胜。

我想我可以做出正确的猜测为什么:Perl和shell以及许多其他传统的* nix东西使用${},带有大括号选项。对于从Perl中逃脱的任何Python开发人员来说$看起来很丑陋,更重要的是,它可能错误地暗示你可以在Python和Perl中使用相同的格式字符串,或者这会给你像Perl那样自动插值,而不像Python那样进行显式插值。如果你放弃$,那么大括号显然不再是可选的。你有它。


对于C#,Win32中有两个不同的格式化API,一个printf - 类似于一个,基于大括号,用于i18n消息目录。大括号变体不允许格式说明符;你必须传递它WCHAR*字符串。类似printf的变体并不允许排序说明符;你必须按顺序传递所有的参数(当你试图将你的信息国际化时,这真的很糟糕,因为通常很难以一种所有参数出现在同一个方面的方式编写翻译句子地点)。 .NET类似于两者中的最佳组合。

答案 1 :(得分:1)

我不知道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)

它允许更多的灵活性和功能。