Python 括号连字符和三引号连字符的差异

date
Mar 30, 2025
slug
the-difference-between-brackets-and-trilpe-quotation-marks
status
Published
tags
Dev
Python
summary
type
Post

引言

从第一次接触 Python 起,就知道如果使用多行文本,就采用 “”” 包裹起来,而且长久以来,通过代码编写 LLM Prompt 也是使用”””,就像下面那样:
但刚刚在看 OpenAI Agents SDK 的 Samples 时,发现它使用的是()拼接的语法,即
遂好奇两者差异点。
一番了解后,这两种写法不仅仅是表现上的语法差异,实际上它们产生的字符串内容和使用场景有着显著不同。

核心差异:空白处理机制

括号连接方式的空白处理

当使用括号连接多个字符串时,Python 会在语法解析阶段将它们合并为一个字符串:
  • 相邻字符串之间没有任何分隔符(包括换行符)
  • 每行代码的缩进不会被包含在最终字符串中
  • 需要手动在每行末尾添加空格(如果需要)
最终生成的字符串是一个没有换行的连续文本:

三引号方式的空白处理

三引号字符串会保留其中的所有字符,包括:
  • 所有换行符
  • 所有缩进空格
  • 开头的换行和结尾前的缩进
最终生成的字符串包含额外的空白:

两种方式的优缺点

括号连接方式

优点:
  1. 精确控制:最终字符串不包含多余的换行和缩进,内容精确可控
  1. 格式一致性:在代码格式化工具(如 black、autopep8)处理后依然保持一致
  1. 无意外空白:不会有意外的前导或尾随空白字符
  1. 适合单行逻辑:虽然代码跨多行,但生成的是逻辑上的单行文本
缺点:
  1. 编辑不便:需要手动管理行尾空格,编辑体验较差
  1. 可读性挑战:对于非常长的文本,阅读和维护可能不够直观
  1. 格式限制:不适合需要保留格式的文本(如 Markdown、HTML、JSON)
  1. 引号处理:如果文本中包含引号,需要适当转义

三引号方式

优点:
  1. 所见即所得:更直观地编辑和查看多行文本,所见即所得
  1. 保留格式:适合需要保留特定格式的文本
  1. 编辑自然:编写更自然,不需要担心行尾空格
  1. 引号友好:可以轻松包含单引号和双引号,无需过多转义
缺点:
  1. 额外空白:包含可能不需要的空白字符(换行和缩进)
  1. 需要后处理:通常需要额外处理来移除不必要的空白
  1. 首尾换行:首尾的换行符可能导致意外行为
  1. 缩进敏感:文本的缩进会影响最终字符串内容
 

实际应用场景

适合使用括号连接的场景

  1. API 提示词:与 API 交互的提示词,其中空白可能影响结果
    1. 简单消息模板:不需要特定格式的简单文本模板
      1. 命令行参数:需要精确控制的命令行参数或 SQL 查询

        适合使用三引号的场景

        1. 格式化文本:包含特定格式的文本,如 Markdown、HTML
          1. 多层引号:包含多种引号的复杂文本
            1. 配置模板:需要保留结构的配置文件模板

              最佳实践:结合两种方法的优点

              对于需要多行编辑便利性但又不想包含多余空白的情况,可以结合使用三引号和 textwrap.dedent() 函数:
              这种方法:
              • 使用三引号提供良好的编辑体验
              • 通过 dedent() 移除共同的前导空白
              • 使用 strip() 移除首尾的换行符

              性能考虑

              在性能方面,两种方法没有显著差异:
              • 括号连接在编译时完成
              • 三引号方式的额外处理(如 dedent()strip())在运行时开销极小
              对于大多数应用场景,选择哪种方法应该基于可读性和维护性,而非性能考虑。

              总结

              选择多行字符串的定义方式应考虑以下因素:
              1. 如果格式不重要,内容简单:使用括号连接方式
              1. 如果需要保留格式或包含复杂引号:使用三引号方式
              1. 如果需要编辑便利性但不要多余空白:使用三引号 + dedent() + strip()
              在处理 AI 提示词、模板字符串或配置文件时,明智地选择多行字符串的定义方式可以提高代码的可读性和可维护性,减少潜在的空白字符问题。
              最后,无论选择哪种方式,保持一致性是最重要的。在项目中应该统一使用一种方法,提高代码维护性
               

              © 溪河 2021 - 2025