在python脚本或IDLE shell中,我们可以使用双引号"
或单引号'
或三个单引号或双引号的组合(主要用于文档字符串)'''
打印文本。
我正在处理一些文本,并尝试了以下内容:''''4''''
扫描文本时出现EOL。然后我这次尝试了使用5个引号,即'''''4'''''
,输出为"''4"
。
最后,我用大量的引号做了同样的尝试:
输入>>> '''''''''''''''''''''''''''''ff'''''''''''''''''''''''''''
输出"''ff"
我不明白为什么python在给定如此大量的'
的情况下返回这样的输出。
问题:它是如何显示如此异常的输出的,它背后的逻辑是什么?
考虑一个简单的FSM(三种主要状态:代码中、字符串中和文档字符串中),它使用输入来处理单引号。当它在代码中并且在一行中遇到三个引号时,它将进入docstring状态。它一直处于docstring状态,直到遇到三个相同类型的引号。当它在代码中并且在一行中遇到少于三个引号时,它将进入字符串状态,并保持该状态,直到遇到(未跳过的)引号(可能会立即出现)。
当这个FSM处于代码状态并遇到一个长的引号序列(与RE/'{3,}/
匹配)时,它进入和退出文档字符串状态(没有遇到非分隔符,所以字符串都是空的),直到最后几个引号字符,在这一点上,它要么仍在文档字符串状态中(所有剩余的引号都在字符串中),要么处于代码状态,并且任何剩余的引号被解释为字符串分隔符。如果它处于字符串或文档字符串状态,遇到一长串引号,它将首先转换到代码状态,然后每三个引号将在代码和文档字符串状态之间转换。结尾处的任何剩余引号都将按照前面所述进行解释。
实际的FSM将需要3个主要状态之外的其他状态,但它们是一个实现细节,在概念上并不重要。FSM也可以通过复制单引号状态&转换,并根据需要对双引号进行修改。
编写FSM的正式描述,并根据练习中留下的连续引号计数从初始状态计算最终状态(即编写函数end_state(initial_state, consecutive_quote_count)
)。
'''''4'''''
被解析为
'''
(开放字符串文字)''4
(字符串内容)'''
(关闭字符串文字)''
(空字符串文字)
我不会做整个长的。但每个''''''
都是一个空的三引号字符串文字,所以它是沿着相同的行。