消息在Python中传递堆栈

时间:2014-03-29 02:57:04

标签: python

通过使用消息传递来填充代码

s = make_stack()
print(s("is_empty")) # True
s("push")(1) 
s("push")(2) 
print(s("peek"))     # [2]
print(str(s("pop"))) # [2]

我的代码应该填补

的空白
def make_stack():
    items = []
    def oplookup(msg):
        if msg == "is_empty":
            # blank #
        elif msg == "clear":
            # blank #
        elif msg == "peek":
            # blank #
        elif msg == "push":
            # blank #
        elif msg == "pop":
            # blank #
        else:
            raise Exception("stack doesn't" + msg)
    return oplookup

我不了解代码的跟踪。我自己的试用代码是

def make_stack():
    items = []
    def oplookup(msg):
        if msg == "is_empty":=
            return True
        elif msg == "clear":
            return []
        elif msg == "peek":
            return make_stack.items[-1]
        elif msg == "push":
            return items.append(msg)
        elif msg == "pop":
            return items.pop()
        else:
            raise Exception("stack doesn't" + msg)
    return oplookup

另一个问题是s(" push")(1),(1)采用什么参数?它是在msg或项目下吗?

1 个答案:

答案 0 :(得分:1)

我认为你遇到的第一个问题是你需要从oplookup返回一些可调用的东西,可能是一个函数。这些函数都需要操作(或测试)items列表(他们可以访问它们,因为它们是闭包)。

以下是代码的外观:

def make_stack():
    items = []
    def oplookup(msg):
        if msg == "is_empty":
            def empty():
                return not items
            return empty
        elif msg == "clear":
            def clear():
                items[:] = [] # slice assignment, to clear in-place
            return clear
        #...

请注意,在clear中,我避免直接​​对items进行分配,因为它位于封闭范围内。在Python 2中,重新分配items是不可能的,因为它既不是本地变量也不是全局变量。在Python 3中,可以使用nonlocal关键字进行重新分配。由于我不知道你正在使用什么版本的Python,我使用的切片分配在两个版本中都有效。

这种代码风格不是很恐怖。更自然的方法是使用方法创建一个类(但最终会得到一个稍微不同的API):

class Stack:
    def __init__(self):
        self.items = []

    def is_empty(self):
        return not self.items

    def clear(self):
        self.items = [] # this time we can replace the list

    def push(self, item):
        self.items.append(item)

    #...