2009-10-28 33 views
4

下面的示例代碼:如何處理未封多行註釋(Python 2.6中)一個記號化錯誤

import token, tokenize, StringIO 

def generate_tokens(src): 
    rawstr = StringIO.StringIO(unicode(src)) 
    tokens = tokenize.generate_tokens(rawstr.readline) 
    for i, item in enumerate(tokens): 
     toktype, toktext, (srow,scol), (erow,ecol), line = item 
     print i, token.tok_name[toktype], toktext 

s = \ 
""" 
def test(x): 
    \"\"\" test with an unterminated docstring 
""" 

generate_tokens(s) 

導致以下火災:

... (stripped a little) 
File "/usr/lib/python2.6/tokenize.py", line 296, in generate_tokens 
    raise TokenError, ("EOF in multi-line string", strstart) 
tokenize.TokenError: ('EOF in multi-line string', (3, 5)) 

有關此行爲的一些問題:

  1. 我應該在這裏抓住'有選擇地'忽略tokenize.TokenError嗎?或者 應該停止嘗試從非兼容/非完整代碼生成令牌嗎?如果是這樣,我該如何檢查?
  2. 這個錯誤(或類似的錯誤)是否可以由未終止的文檔字符串以外的其他內容引起?
+0

爲什麼downvote (問題後一年半)? – ChristopheD 2011-02-06 08:11:50

回答

2

你如何處理標記錯誤完全取決於你爲什麼要標記。你的代碼爲你提供了所有有效的令牌,直到壞字符串文字開頭。如果該令牌流對您有用,請使用它。

你有什麼用錯誤做了幾個選項:

  1. 你可以忽視它有一個不完整的令牌流。

  2. 如果沒有發生錯誤,您可以緩衝所有令牌並僅使用令牌流。

  3. 您可以處理令牌,但如果發生錯誤則中止較高級別的處理。

至於這個錯誤是否可以發生在除了不完整的文檔字符串以外的任何其他位置,是的。請記住,docstrings只是字符串文字。任何未終止的多行字符串文字都會給你同樣的錯誤。代碼中的其他詞法錯誤可能會發生類似的錯誤。

例如,這裏是產生錯誤(至少與Python 2.5)類的其它值:

s = ")" # EOF in multi-line statement 
s = "(" # EOF in multi-line statement 
s = "]" # EOF in multi-line statement 
s = "[" # EOF in multi-line statement 
s = "}" # EOF in multi-line statement 
s = "{" # EOF in multi-line statement 

奇怪的是,其他無意義的輸入產生ERRORTOKEN值代替:

s = "$" 
s = "'" 
+0

謝謝!這是我正在尋找的信息類型。我希望有一種方法可以攔截(並忽略)這些令牌化錯誤,使得令牌化器不會停止解析其他令牌,所以我可以(最終)根據縮進/縮進令牌排除無效的「塊」。但是,很可能 - 也是合理的 - 發電機處於過於不一致/不可預測的狀態,無法繼續標記... – ChristopheD 2009-10-28 23:05:22

+0

沒錯。僞造字符串後沒有合理的下一個標記,特別是在確定存在錯誤之前,它讀取了文件的全部其餘部分。 – 2009-10-28 23:10:22