2016-03-22 41 views
1

所以我從redblob遊戲(http://www.redblobgames.com/)這個好人那得到了這段代碼,我在轉換他的Py3.0代碼時遇到了一些困難到Py2.7。將代碼從Py3.0轉換爲2.7Py Super()和打印聲明

代碼可以在這裏找到。這是相當大的,所以我得到,如果你不想看看它:(http://www.redblobgames.com/pathfinding/a-star/implementation.py

如果你可以請建議一些改變,我可以做到這一點,將不勝感激。目前我發現了3個錯誤,其中2個是我不瞭解的語法。


語法1

def from_id_width(id, *, width):

的誤差是 「*」,


語法2

print("%%-%ds" % width % draw_tile(graph, (x, y), style, width), end="") 

誤差結束= 「」


類型錯誤

class GridWithWeights(SquareGrid): 
def __init__(self, width, height): 
    super().__init__(width, height) 
    self.weights = {} 

super()至少需要1個參數(0給出)

但是,當我在super()GridWithWeights

TypeError: must be type, not classobj 
+0

另請注意,根據我的經驗,如果您在Python 2和Python 3之間進行轉換,最狡猾的變化是整數除法3/2 = 1(Python 2)vs 3/2 = 1.5(Python 3)。如果你想要在兩個版本中進行整數除法,最好使用3 // 2。 – Matthias

+0

@Matthias'from __future__ import division'? – Carpetsmoker

+0

@Carpetsmoker是的,你可以導入Python 3的行爲。但是我發現它更容易(例如,在交互式shell中編寫一些命令)以使用另一個不必每次都要導入的運算符。此外,導入只會改變Python 2中的行爲(在Python 3中這是默認設置),所以在你想要兼容Python 2和Python 3的代碼時,這看起來很奇怪(在我看來)。 – Matthias

回答

2

爲了from_id_width工作您需要刪除關鍵字arg標記*

def from_id_width(id, width): 
    return (id % width, id // width) 

print可以固定從__future__其導入:

from __future__ import print_function 

最後__init__需要調用super有點不同:

class GridWithWeights(SquareGrid): 
    def __init__(self, width, height): 
     super(GridWithWeights, self).__init__(width, height) 
     self.weights = {} 

和父類必須轉換爲新款式:

class SquareGrid(object):