python 中字符串终止文字的逻辑(即单引号和双引号)

Logic of string termination literal in python (namely the single and double quotes)

在 python 脚本或 IDLE shell 中,我们可以使用双引号 " 或单引号 ' 或三个单引号或双引号的组合来打印文本(主要用于文档字符串)'''.

我正在处理一些文本并尝试了以下方法: ''''4'''' 扫描文本时出现 EOL。 然后这次我尝试使用 5 个引号,即 '''''4''''' 并且输出是 "''4".

最后,我用大量的引号尝试了同样的方法:
输入
>>> '''''''''''''''''''''''''''''ff'''''''''''''''''''''''''''
输出
"''ff"


我不明白为什么 python returns 给出如此大量的 ' 这样的输出。
问题:怎么会出现这样的异常输出,背后的逻辑是什么?

'''''4''''' 被解析为

  • '''(开放字符串文字)
  • ''4(字符串的内容)
  • '''(关闭字符串文字)
  • ''(空字符串文字)

我不会做整个长篇。但是每个 '''''' 都是一个空的三引号字符串文字,所以它是沿着相同的线。

考虑一个简单的 FSM(三种主要状态:在代码中、在字符串中、在文档字符串中)使用输入来处理单引号。当在代码中,遇到连续三个引号,就进入docstring状态。它一直处于文档字符串状态,直到遇到三个相同类型的引号。当它在代码中并且连续遇到少于三个引号时,它会进入字符串状态,并保持该状态直到遇到(未转义的)引号(可能立即)。

当这个FSM在code状态,遇到一长串引号(匹配RE/'{3,}/),进入和退出docstring状态(没有遇到非分隔符,所以字符串是全部为空)直到最后几个引号字符,此时它要么仍然处于文档字符串状态(并且任何剩余的引号都在字符串中)要么处于代码状态,并且任何剩余的引号都被解释为字符串定界符。如果在string 或docstring 状态遇到一长串引号,它会先转换到code 状态,然后每三个引号在code 和docstring 状态之间转换。末尾的任何剩余引号都按前面提到的解释。

实际的 FSM 将需要除 3 个主要状态之外的其他状态,但它们是实现细节,在概念上并不重要。通过复制单引号状态和转换并根据双引号进行适当修改,可以轻松扩展 FSM 以处理双引号。

编写 FSM 的正式描述并根据连续引号的计数从初始状态计算最终状态(即编写函数 end_state(initial_state, consecutive_quote_count))留作练习。