对实例化对象使用update()

时间:2014-02-11 14:49:14

标签: python

如果我提出一个有点明显的问题,我会事先道歉,但我对Python有些新意,我仍在弄清楚它的问题。

我正在编写一个脚本来搜索树,从节点A开始,(希望)终止于目标节点M.我的工作基于人工智能:现代方法中提供的示例代码specifically this Python search script

尝试执行breadth_first_search时遇到困难,我收到以下错误:

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

我正在尝试使用update() function来更新节点的状态,父级,子级等,其代码如下:

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

我现在已经坚持了一段时间,我不确定如何继续。我将非常感谢任何有助于解决此问题的建议。谢谢!

4 个答案:

答案 0 :(得分:1)

update()是字典对象的实例方法。除非您为Node定义相同的方法:

class Node:

    ...

    def update(self, ...)

在课堂上有一个字典,可以是update d:

class Node:

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

或创建或import带有Node对象的函数:

def update(node, ...)

它将无法使用。

答案 1 :(得分: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 repo及其目录结构才能使其正常工作。

答案 2 :(得分: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语句。

答案 3 :(得分:0)

您链接的update()函数是dict类型的方法。如果你的对象是dict的子类(或子类的子类),你应该可以调用

self.update()