2012-05-15 33 views
14

我試圖將我的代碼編譯到Python 3模塊中。它運行正常,當我選擇在空閒「運行模塊」,但收到以下語法錯誤,當我嘗試創建一個分佈:未編譯的嵌套參數

File "/usr/local/lib/python3.2/dist-packages/simpletriple.py", line 9 
    def add(self, (sub, pred, obj)): 
       ^
SyntaxError: invalid syntax 

誰能幫指出什麼是錯的語法?下面是完整的代碼:

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"))) 
+1

請把你的代碼在這裏,對引擎收錄或其他地方,所以沒有必要下載它。 – Tadeck

+0

@Tadeck:實際上,他給了回溯的足夠背景,所以可能沒有必要。 –

回答

22

PEP 3113解釋了爲什麼這個功能,「元組參數拆包」,在Python 3除去這也解釋瞭如何端口使用它們的代碼。在這種情況下,你需要改變像一個函數:

def add(self, (sub, pred, obj)): 
    self._addToIndex(self._spo, sub, pred, obj) 
    self._addToIndex(self._pos, pred, obj, sub) 
    self._addToIndex(self._osp, obj, sub, pred) 

到通元組作爲一個單一的參數,實現手工解包版本:

def add(self, sub_pred_obj): 
    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) 
+0

自從該書(OP引用)發佈以來,在編碼方面有很多變化。我正在處理這些代碼,並面臨同樣的問題,並且遇到了您的帖子。是否有一種資源,我可以回退以獲得關於代碼如何更改的更多說明,因爲我正在閱讀本書中的所有代碼(最終) – oivemaria

+1

當函數是lambda時,如何對代碼進行編碼?使用't [0]''t [1]'和't [2]'? – Pynchia