簡體   English   中英

python,x =“”“”“”; lexed為三引號或3對引號

[英]python, x = “”“”“”; lexed as triple quotes or 3 pairs of quotes

在python中你可以這樣說:

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

Python詞法分析器是否將此視為兩個三重引號而內部沒有任何內容? 即沿着x = """ """ (沒有空格)?

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

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

所以我可以看到x = """"""也可能沿着x = "" "" "" (沒有空格)。 我只是想知道, """"""被稱為兩個三重引號還是三對正常引號? 或完全不同的東西? 謝謝!

編輯:顯然,作為Python中的程序員並不重要。 但是,Python解釋器肯定必須選擇其中之一,我想知道哪個。

您可以使用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'。 第二個是'=',第三個是'“”“”“”。 沒有三個“”“代幣。

PS用於比較:

>>> 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), '')]

它的詞匯單串。 三引號字符串是唯一可以跨越多行的形式(與其他語言不同,它允許所有字符串,或者沒有字符串跨越行)。

這個特定的語法可能被選中,因為它使語法高亮簡單,標記匹配的引號對。 雖然這仍然可能錯誤地突出顯示無效的python(跨越行的單引號字符串),但它通常對於文本編輯器來說已經足夠了。

解析器在讀取引號時,會檢查兩個相同類型的引用,如果找到它們,則僅在三個連續引號上終止該字符串。 否則它會在下一個引號上終止字符串,除非首先有換行符,否則會產生錯誤。

它僅被識別為一對三引號。

檢查一下

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

>>> id("")
140579203310856

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

這基本上意味着,這對三重引號被標識為與普通報價相同。

另外,如果你使用兩個雙引號的id,如下所示

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

它不會終止,因為詞法分析器現在將其視為文檔字符串並期望字符串有效終止。

如果你沒有文字,那就是一樣的。 嘗試以下方法:

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

您可以使用ast模塊查看python用於此的語法樹。 例如:

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

如您所見,它是一個空字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM