2011-03-31 77 views
1

這是我的一個previous question隨訪,我使用的是2to3的工具,通過塞特希庫馬蘭的建議轉換代碼到3.x

它似乎運作良好,但它並沒有拿起這個部分:

raise LexError,("%s:%d: Rule '%s' returned an unknown token type '%s'" % (
    func.func_code.co_filename, func.func_code.co_firstlineno, 
    func.__name__, newtok.type),lexdata[lexpos:]) 

在3.2中看起來應該如何?

編輯:從下面的答案變化很好,2to3現在似乎工作正常。在setup.py編譯中,我現在得到下面的錯誤,看看我的新的question

回答

3

LexError後刪除逗號。這工作在兩個Python 2和Python 3的

在Python 2有一個很少使用的語法來拋出異常這樣的:

raise ExceptionClass, "The message string" 

這是這裏所使用的,但由於某些原因,也許是因爲有消息字符串周圍括號(根據Senthils測試,這是在做它的括號中的換行符),2to3的錯過改變成好得多:

raise ExceptionClass("The message string") 

因此,它應該是這樣的(在Python 2)

message = "%s:%d: Rule '%s' returned an unknown token type '%s'" % (
      func.func_code.co_filename, func.func_code.co_firstlineno, 
      func.__name__, newtok.type),lexdata[lexpos:]) 
raise LexError(message) 

因爲在同一行上格式化該消息非常麻煩。 :-) 然後,func_code已經重新命名,所以在Python 3中有更多的更改。但隨着上述變化2to3應該正常工作。

+0

建議的更改是可以的,2to3現在撿起它,但我在構建中(2to3更改後)出現錯誤。我編輯了我的問題。 – Remko 2011-03-31 09:18:52

+0

@Remko:這是一個不同的問題。您應該刪除編輯並改爲創建一個新問題。除了新的問題是重複的。 :) http://stackoverflow.com/search?q=Attempted+relative+import+in+non-package – 2011-03-31 09:43:03

+0

創建新的問題,如果它是重複的請指出我,因爲我發現了幾個相同的錯誤的問題,但wasn'能夠從他們那裏獲得解決方案。 – Remko 2011-03-31 09:48:10

8

功能的func_code屬性已更名爲__code__,所以儘量

func.__code__.co_filename, func.__code__.co_firstlineno, 

爲您的代碼段的第二行。

+0

+1感謝您的解釋 – Remko 2011-03-31 09:14:20

1

你有什麼問題? 2to3似乎對我來說很好。

- raise LexError,("%s:%d: Rule '%s' returned an unknown token type '%s'" % (func.func_code.co_filename,func.func_code.co_firstlineno,func.__name__,newtok.type),lexdata[lexpos:]) 
+ raise LexError("%s:%d: Rule '%s' returned an unknown token type '%s'" % (func.__code__.co_filename,func.__code__.co_firstlineno,func.__name__,newtok.type),lexdata[lexpos:]) 
+1

也許如果您添加換行符,它將停止工作? – 2011-03-31 08:28:43

+0

哦,我明白了。很可能是2to3的一個bug。 – 2011-03-31 08:33:41

+0

是的,用2to3覆蓋所有奇怪的病例可能會很痛苦。 – 2011-03-31 08:35:11