滕州营销型网站建设wordpress建地方门户
2026/4/5 20:38:29 网站建设 项目流程
滕州营销型网站建设,wordpress建地方门户,德清网站设计,做网站文字编辑好不好PEP 822 – 消除缩进的多行字符串#xff08;d-string#xff09; 作者#xff1a; Inada Naoki 摘要 本 PEP 提议增加一个功能#xff0c;用于自动从多行字符串字面量中移除缩进。 消除缩进的多行字符串#xff08;dedented multiline strings#xff09;使用一个新的…PEP 822 – 消除缩进的多行字符串d-string作者Inada Naoki摘要本 PEP 提议增加一个功能用于自动从多行字符串字面量中移除缩进。消除缩进的多行字符串dedented multiline strings使用一个新的前缀“d”“dedent”的简写放在多行字符串字面量的开引号之前。示例空格用下划线_可视化defhello_paragraph()-str:____return d ________p __________Hello, World! ________/p ____末尾的三引号决定了要移除多少缩进。在上面的例子中返回的字符串将包含三行____p\n四个前导空格______Hello, World!\n六个前导空格____/p\n四个前导空格动机在深度缩进的 Python 代码中编写多行字符串字面量时用户面临以下选择接受字符串字面量的内容将左对齐。使用多个单行字符串字面量拼接而不是使用一个多行字符串字面量。使用textwrap.dedent()来移除缩进。所有这些选项在代码可读性和可维护性方面都有缺点。左对齐的多行字符串看起来不协调往往被避免使用。在实践中包括 Python 自己的测试代码在内的许多地方都选择其他方法。拼接的单行字符串字面量更冗长更难维护。textwrap.dedent()是用 Python 实现的因此需要一些运行时开销。它不能在性能关键的热路径中使用。本 PEP 旨在为消除缩进的多行字符串提供一种内置语法它既易于读写在运行时也高效。原理此想法的主要替代方案是用 C 语言实现textwrap.dedent()并将其作为str.dedent()方法提供。这种方法可以减少textwrap.dedent()的运行时开销。通过使其成为内置方法当直接在字符串字面量上调用时还允许进行编译时缩进移除。然而这种方法有几个缺点为了支持用户希望在字符串中包含某些缩进的情况dedent()方法需要接受一个参数来指定要移除的缩进量。这对用户来说将是繁琐且容易出错的。当使用续行符行尾带有反斜杠的行时它们无法被消除缩进。f-字符串可能会将表达式插值为多行字符串而没有缩进。在这种情况下f-string str.dedent()无法消除整个字符串的缩进。t-字符串不创建 str 对象因此它们不能使用str.dedent()方法。虽然可以向string.templatelib.Template添加dedent()方法但这会导致不一致因为 t-字符串和 f-字符串非常相似但在消除缩进方面会有不同的行为。str.dedent()方法对于非字面量字符串仍然有用因此本 PEP 并不排斥这个想法。然而为了便于在多行字符串字面量中使用提供专用的语法更为优越。规范为消除缩进的多行字符串添加一个新的字符串字面量前缀“d”。该前缀可以与“f”、“t”和“r”前缀组合使用。该前缀仅用于多行字符串字面量。因此它只能与三引号或一起使用。在单引号或双引号或上使用它是一个语法错误。开头的三引号后必须跟一个换行符。此换行符不包含在结果字符串中。要移除的缩进量由紧接在末尾三引号之前的空白字符空格 或制表符\t决定。在缩进中混合使用空格和制表符会引发TabError类似于 Python 自己的缩进规则。消除缩进的过程从字符串中的每一行移除确定的先导空白字符量。比确定的缩进量短的行会变成一个空行例如\n。否则如果该行不是以确定的缩进开始Python 会引发IndentationError。除非与“r”前缀结合使用反斜杠转义在处理完移除缩进后才被处理。因此你不能使用\t来创建缩进。并且你可以使用行延续符行尾的反斜杠并从延续行中移除缩进。示例为清晰起见空格显示为_制表符显示为---。错误消息仅为解释实际消息可能不同。sd# SyntaxError: d-string must be a multiline stringsdHello# SyntaxError: d-string must be a multiline stringsdHello __World! # SyntaxError: d-string must start with a newlinesd __Hello __World!# SyntaxError: d-string must end with an indent-only linesd __Hello __World! # 不移除缩进因为末尾引号没有缩进。print(repr(s))# __Hello\n__World!\nsd __Hello __World! _# 移除一个空格的缩进。print(repr(s))# _Hello\n_World!\nsd __Hello __World! __# 移除两个空格的缩进。print(repr(s))# Hello\nWorld!\nsd __Hello __World! ___# IndentationError: missing valid indentationsd ---__Hello __World! # 允许制表符作为缩进。# 空格只是字符串的一部分不是要移除的缩进。print(repr(s))# __Hello\n__World!\nsd ____World! ---__# TabError: mixing spaces and tabs in indentationsd __Hello \ __World!\ __# 行延续符正常工作print(repr(s))# Hello_World!sd\ __Hello __World __# SyntaxError: d-string must starts with a newline.sdr __Hello\ __World!\ __# d-string 可以与 r-string 结合。print(repr(s))# Hello\\\nWorld!\\\nsdf ____Hello,{world.title()}! ____# d-string 也可以与 f-string 和 t-string 结合。print(repr(s))# Hello, World!\nsdt ____Hello, {world.title()}! ____print(type(s))# class string.templatelib.Templateprint(s.strings)# (Hello, , !\n)print(s.values)# (World,)print(s.interpolations)# (Interpolation(World, world.title(), None, ),)如何教授此功能在教程中可以结合三引号字符串字面量来介绍 d-string。此外可以在textwrap.dedent()的文档中添加一个注释提供指向语言参考中 d-string 部分或教程相关部分的链接。其他具有类似功能的语言Java 15引入了一个称为文本块text blocks的功能。由于 Java 以前没有使用三引号他们引入了用于多行字符串字面量的三引号并自动移除缩进。C# 11也引入了一个类似的功能称为原始字符串字面量raw string literals。Julia和Swift也支持自动移除缩进的三引号字符串字面量。PHP 7.3引入了灵活的 Heredoc 和 Nowdoc 语法。虽然它使用结束标记例如END ... END而不是三引号但它也会从文本中移除缩进。Java 和 Julia 使用缩进最少的那一行来确定要移除的缩进量。Swift、C# 和 PHP 使用末尾三引号或结束标记的缩进。本 PEP 选择了 Swift 和 C# 的方法因为它更简单且更容易解释。参考实现PEP 822 的一个 CPython 实现可在methane/cpython#108获取。被拒绝的想法str.dedent()方法正如原理部分提到的本 PEP 并不拒绝str.dedent()方法这个想法。一个用 C 实现的更快的textwrap.dedent()版本对运行时缩进移除会很有用。然而d-string 更适合多行字符串字面量因为它能很好地与 f/t-strings 配合工作。它允许更轻松地指定要移除的缩进量。它可以消除续行符的缩进。三重反引号Triple-backtick考虑使用三重反引号作为消除缩进的多行字符串的替代语法。这种符号在 Markdown 中为我们所熟悉。虽然过去存在对某些键盘布局的担忧但如今许多人已经习惯输入这种符号。然而当在 Markdown 中嵌入 Python 代码或反之亦然时这种符号会产生冲突。因此考虑到这些缺点增加引号字符的种类被认为不如为字符串字面量添加前缀优越。__future__导入除了为字符串字面量添加前缀之外还考虑过使用__future__导入来改变多行字符串字面量的默认行为。这可能有助于将来简化 Python 的语法。但是将所有现有的复杂代码库重写为新符号可能并不简单。在该源代码中的所有多行字符串都被重写为新符号之前无法利用自动缩进移除功能。在所有用户能够将现有代码库重写为新符号之前两种类型的 Python 语法将无限期共存。因此许多人更喜欢新的字符串前缀而不是__future__导入。版权本文档置于公共领域或 CC0-1.0-Universal 许可证下以更宽松者为准。来源https://github.com/python/peps/blob/main/peps/pep-0822.rst最后修改时间2026-01-07 15:13:47 GMT更多精彩内容 请关注我的个人公众号 公众号办公AI智能小助手或者 我的个人博客 https://blog.qife122.com/对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号网络安全技术点滴分享

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询