python,x =“”“”“”; lexed为三引号或3对引号

时间:2014-07-30 13:41:28

标签: python

在python中你可以这样说:

x = """""" # x = ''

Python词法分析器是否将此视为两个三重引号,内部没有任何内容?即沿着x = """ """(没有空格)?

这是我的直接想法。但是,这在python中是可能的:

>>> "4" "5"
'45'
>>> # and
>>> "4""5"
'45'

所以我可以看到x = """"""也可能沿着x = "" "" ""(没有空格)的方向排列。 我只是想知道,""""""是否被列为两个三重引号或三对正常引号?或完全不同的东西?谢谢!

编辑:显然,它作为Python程序员并不重要。但是,Python解释器肯定必须选择其中一个,我想知道哪个。

5 个答案:

答案 0 :(得分:8)

您可以使用tokenizer

来判断
>>> from StringIO import StringIO
>>> from tokenize import generate_tokens as gt
>>> from pprint import pprint as pp
>>> code = 'x=""""""'
>>> codeio = StringIO(code)
>>> tokens = list(gt(codeio.readline))
>>> pp(tokens)
[(1, 'x', (1, 0), (1, 1), 'x=""""""'),
 (51, '=', (1, 1), (1, 2), 'x=""""""'),
 (3, '""""""', (1, 2), (1, 8), 'x=""""""'),
 (0, '', (2, 0), (2, 0), '')]

第一个标记是' x'。第二个是' ='第三个是"""""""'。没有三个""''令牌。

P.S。比较:

>>> othercode='y="led" "zeppelin"'
>>> othercodeio = StringIO(othercode)
>>> othertokens = list(gt(othercodeio.readline))
>>> pp(othertokens)
[(1, 'y', (1, 0), (1, 1), 'y="led" "zeppelin"'),
 (51, '=', (1, 1), (1, 2), 'y="led" "zeppelin"'),
 (3, '"led"', (1, 2), (1, 7), 'y="led" "zeppelin"'),
 (3, '"zeppelin"', (1, 8), (1, 18), 'y="led" "zeppelin"'),
 (0, '', (2, 0), (2, 0), '')]

答案 1 :(得分:1)

它词汇上只有一个字符串。三引号字符串是唯一可以跨越多行的形式(与其他语言不同,它允许所有字符串,或者没有字符串跨越行)。

这个特定的语法可能被选中,因为它使语法高亮简单,标记匹配的引号对。虽然这仍然可能错误地突出显示无效的python(跨越行的单引号字符串),但通常它对于文本编辑器来说已经足够了。

解析器在读取引号时会检查两个相同类型的引用,如果找到它们,则仅在三个连续引号上终止字符串。否则它会在下一个引号上终止字符串,除非首先有换行符,否则会产生错误。

答案 2 :(得分:0)

它仅被识别为一对三引号。

检查

>>> id("""""")
140579203310856

>>> id("")
140579203310856

>>> id("" "" "")
140579203310856

这基本上意味着,这对三引号的标识与普通引用相同。

另外,如果你输入两个双引号的id,如下所示

>>> id("""")
....

它不会终止,因为词法分析器现在将其视为文档字符串并期望字符串有效终止。

答案 3 :(得分:-1)

如果你没有文字,那就是一样的。 尝试以下方法:

>>> """abc"""
'abc'
>>> "a""b""c"
'abc'
>>> "a""b""c" == """abc"""
True

答案 4 :(得分:-2)

您可以使用ast模块查看python用于此的语法树。 e.g:

>>> import ast
>>> source = '""""""""'
>>> node = ast.parse(source, mode='eval')
>>> ast.dump(node)
"Expression(body=Str(s=''))"

如您所见,它是一个空字符串。