2014-02-11 89 views
0

如果我提出了一個有點明顯的問題,我很抱歉,但是我對Python有些新鮮,並且仍然在找出它的扭結。對實例化對象使用update()

我正在研究一個腳本,在節點A處開始搜索並(有希望)終止於目標節點M.我的工作基於提供的示例代碼人工智能:現代方法specifically this Python search script

... 
update(self, state=state, parent=parent, action=action, 
     path_cost=path_cost, depth=0) 
NameError: global name 'update' is not defined 

我試圖使用update() function更新狀態,父母,子女等的節點:

我試圖執行一個breadth_first_search,在那裏我得到以下錯誤,當遇到困難,其中的代碼如下:

class Node: 

    def __init__(self, state, parent=None, action=None, path_cost=0): 
     "Create a search tree Node, derived from a parent by an action." 
     update(self, state=state, parent=parent, action=action, 
       path_cost=path_cost, depth=0) 
     if parent: 
      self.depth = parent.depth + 1 

我一直在這一段時間卡住了,我不確定如何繼續。我將不勝感激任何有助於解決此問題的建議。謝謝!

+5

你的「更新」可能是包「utils的」,這是對的頂部進口的部分python搜索腳本。你輸入了嗎? – synthomat

+2

具體來說,從''utils import *'說''的行。如果你在同一個鏈接上打開'utils.py',你會在那裏看到'update'功能。 –

回答

0

update()是內建的dict類型的方法。請注意該方法文檔所在的部分。如果您使用的是字典,讓我們把它my_dict,你會做這樣的事情:

my_dict.update(state=state, parent=parent, action=action, path_cost=path_cost, depth=0) 

但我不知道你是用字典爲您的代碼。您發佈的鏈接沒有定義update()功能。它必須與行的示例代碼頂級進口:

from utils import * 

這是假設在utils.py有一個名爲update功能。如果是這種情況,則需要在文件中包含該import聲明。

+0

D'oh。就是這樣。我不得不圍繞AIMA網站進行一些額外的搜索以找到utils.py文件。感謝您的信息,我明白了使用update()吧! – Sandman

0

您爲update提供的鏈接不是全局函數,而是字典的成員,因此必須在字典上調用。如果你的班級有一個,比如說數據

def __init__(self, state, parent=None, action=None, path_cost=0): 
    "Create a search tree Node, derived from a parent by an action." 
    self.data.update(state=state, parent=parent, action=action, path_cost=path_cost, depth=0) 
    # Note the indentation 

編輯

此外,並不是你的代碼鏈接到也有utils.py here 定義一個全局更新功能,會做什麼Node正在試圖做的事:

def update(x, **entries): 
    """Update a dict; or an object with slots; according to entries. 
    >>> update({'a': 1}, a=10, b=20) 
    {'a': 10, 'b': 20} 
    >>> update(Struct(a=1), a=10, b=20) 
    Struct(a=10, b=20) 
    """ 
    if isinstance(x, dict): 
     x.update(entries) 
    else: 
     x.__dict__.update(entries) 
    return x 

你可能需要得到整個svn回購,與他們的可怕ctory結構爲了得到這個工作。

+0

賓果。在發佈這個問題並收到一些回覆後,我迅速挖掘了這一點。我有點尷尬,因爲錯過了! – Sandman

1

update()是字典對象的實例方法。除非您爲您的Node同樣的方法:

class Node: 

    ... 

    def update(self, ...) 

具有類內的一個字典,可以update d:

class Node: 

    def __init__(self, ...): 
     ... 
     self.some_dict.update(...) 

或創建或import,需要一個Node對象的函數:

def update(node, ...) 

它將不可用。

+0

感謝您的輸入!這是在正確的軌道上,我無法從utils.py中導入更新的定義。 – Sandman

0

您鏈接的update()函數是字典類型的一種方法。如果你的對象是字典的一個子類(或子類的子類),你應該能夠調用

self.update()