2015-05-04 70 views
-5

我碰到this solution轉換代碼到3.x

之際,我想轉換代碼呈現here。代碼也提供在這個問題的末尾

但我無法使用包2to3的任何進展。我試過使用技術指南here但無濟於事。

如果有人願意協助,我已準備好進行spoon,。我用命令行運行至今的代碼,我不知道爲什麼我不斷收到錯誤

2to3 Amended.py 

哪裏Amended.py是具有2.x版代碼的文件。我得到

SyntaxError: invalid syntax 

enter image description here

import csv 

class SimpleGraph: 
    def __init__(self): 
     self._spo = {} 
     self._pos = {} 
     self._osp = {} 

    def add(self,sub_pred_obj): 
     """ 
     Adds a triple to the graph. 
     """ 
     self._addToIndex(self._spo, sub, pred, obj) 
     self._addToIndex(self._pos, pred, obj, sub) 
     self._addToIndex(self._osp, obj, sub, pred) 

    def _addToIndex(self, index, a, b, c): 
     """ 
     Adds a triple to a specified index. 
     """ 
     if a not in index: index[a] = {b:set([c])} 
     else: 
      if b not in index[a]: index[a][b] = set([c]) 
      else: index[a][b].add(c) 

    def remove(self, (sub, pred, obj)): 
     """ 
     Remove a triple pattern from the graph. 
     """ 
     triples = list(self.triples((sub, pred, obj))) 
     for (delSub, delPred, delObj) in triples: 
      self._removeFromIndex(self._spo, delSub, delPred, delObj) 
      self._removeFromIndex(self._pos, delPred, delObj, delSub) 
      self._removeFromIndex(self._osp, delObj, delSub, delPred) 

    def _removeFromIndex(self, index, a, b, c): 
     """ 
     Removes a triple from an index and clears up empty indermediate structures. 
     """ 
     try: 
      bs = index[a] 
      cset = bs[b] 
      cset.remove(c) 
      if len(cset) == 0: del bs[b] 
      if len(bs) == 0: del index[a] 
     # KeyErrors occur if a term was missing, which means that it wasn't a valid delete: 
     except KeyError: 
      pass 

    def triples(self, (sub, pred, obj)): 
     """ 
     Generator over the triple store. 
     Returns triples that match the given triple pattern. 
     """ 
     # check which terms are present in order to use the correct index: 
     try: 
      if sub != None: 
       if pred != None: 
        # sub pred obj 
        if obj != None: 
         if obj in self._spo[sub][pred]: yield (sub, pred, obj) 
        # sub pred None 
        else: 
         for retObj in self._spo[sub][pred]: yield (sub, pred, retObj) 
       else: 
        # sub None obj 
        if obj != None: 
         for retPred in self._osp[obj][sub]: yield (sub, retPred, obj) 
        # sub None None 
        else: 
         for retPred, objSet in self._spo[sub].items(): 
          for retObj in objSet: 
           yield (sub, retPred, retObj) 
      else: 
       if pred != None: 
        # None pred obj 
        if obj != None: 
         for retSub in self._pos[pred][obj]: 
          yield (retSub, pred, obj) 
        # None pred None 
        else: 
         for retObj, subSet in self._pos[pred].items(): 
          for retSub in subSet: 
           yield (retSub, pred, retObj) 
       else: 
        # None None obj 
        if obj != None: 
         for retSub, predSet in self._osp[obj].items(): 
          for retPred in predSet: 
           yield (retSub, retPred, obj) 
        # None None None 
        else: 
         for retSub, predSet in self._spo.items(): 
          for retPred, objSet in predSet.items(): 
           for retObj in objSet: 
            yield (retSub, retPred, retObj) 
     # KeyErrors occur if a query term wasn't in the index, so we yield nothing: 
     except KeyError: 
      pass 

    def value(self, sub=None, pred=None, obj=None): 
     for retSub, retPred, retObj in self.triples((sub, pred, obj)): 
      if sub is None: return retSub 
      if pred is None: return retPred 
      if obj is None: return retObj 
      break 
     return None 

    def load(self, filename): 
     f = open(filename, "rb") 
     reader = csv.reader(f) 
     for sub, pred, obj in reader: 
      sub = unicode(sub, "UTF-8") 
      pred = unicode(pred, "UTF-8") 
      obj = unicode(obj, "UTF-8") 
      self.add((sub, pred, obj)) 
     f.close() 

    def save(self, filename): 
     f = open(filename, "wb") 
     writer = csv.writer(f) 
     for sub, pred, obj in self.triples((None, None, None)): 
      writer.writerow([sub.encode("UTF-8"), pred.encode("UTF-8"), obj.encode("UTF-8")]) 
     f.close() 

if __name__ == "__main__": 
    g = SimpleGraph() 
    g.add(("blade_runner", "name", "Blade Runner")) 
    g.add(("blade_runner", "name", "Blade Runner")) 
    g.add(("blade_runner", "release_date", "June 25, 1982")) 
    g.add(("blade_runner", "directed_by", "Ridley Scott")) 

    print list(g.triples((None, None, None))) 
    print list(g.triples(("blade_runner", None, None))) 
    print list(g.triples(("blade_runner", "name", None))) 
    print list(g.triples(("blade_runner", "name", "Blade Runner"))) 
    print list(g.triples(("blade_runner", None, "Blade Runner"))) 
    print list(g.triples((None, "name", "Blade Runner"))) 
    print list(g.triples((None, None, "Blade Runner"))) 

    print list(g.triples(("foo", "name", "Blade Runner"))) 
    print list(g.triples(("blade_runner", "foo", "Blade Runner"))) 
    print list(g.triples(("blade_runner", "name", "foo"))) 
+0

是,所有的錯誤消息說? – Kevin

+1

請包括問題中的代碼;與semprog.org的鏈接已經死亡。 –

+1

*「如果有人願意協助,我準備好進行spoon」「* - 對於所有事情的熱愛,請閱讀http://stackoverflow.com/help/how-to-ask – jonrsharpe

回答

0
def add(self,sub_pred_obj): 
    """ 
    Adds a triple to the graph. 
    """ 
    self._addToIndex(self._spo, sub, pred, obj) 
    self._addToIndex(self._pos, pred, obj, sub) 
    self._addToIndex(self._osp, obj, sub, pred) 

子預計值與obj沒有定義一個錯誤,因爲 「增加」 的第二個參數是 sub_pred_obj(sub, pred, obj)

編輯: 這應該修復它:

def add(self,sub_pred_obj): 
    """ 
    Adds a triple to the graph. 
    """ 
    sub, pred, obj = sub_pred_obj 
    self._addToIndex(self._spo, sub, pred, obj) 
    self._addToIndex(self._pos, pred, obj, sub) 
    self._addToIndex(self._osp, obj, sub, pred) 

此行是重要的一個:sub, pred, obj = sub_pred_obj

+0

那麼還有誰願意理解我的問題和立場,並提出解決方案嗎? – oivemaria

+0

這應該修復它。至少現在代碼是有效的。 – Yurippenet