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)
)留作练习。
在 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)
)留作练习。