Python 如何使用LifoQueue进行函数调用?
我正在做一个数独解算器,想让指令一次执行一个,采用后进先出的结构,以类似大多数人(或至少我)玩数独的方式 我的解算器课程的相关部分-Python 如何使用LifoQueue进行函数调用?,python,stack,python-3.6,Python,Stack,Python 3.6,我正在做一个数独解算器,想让指令一次执行一个,采用后进先出的结构,以类似大多数人(或至少我)玩数独的方式 我的解算器课程的相关部分- class SudokuSolver(): possible_answers = None def __init__(self, board): self.board = board self.instruction_stack = LifoQueue() ... def work_on_
class SudokuSolver():
possible_answers = None
def __init__(self, board):
self.board = board
self.instruction_stack = LifoQueue()
...
def work_on_group(self, group_num):
print(f"working on group {group_num}")
def work_on_row(self, row):
print(f"working on row {row}")
def work_on_column(self, column):
print(f"working on column {column}")
def do_next_step(self):
if self.instruction_stack.empty():
self.instruction_stack.put(self.work_on_group(9))
self.instruction_stack.put(self.work_on_group(8))
...
self.instruction_stack.put(self.work_on_group(2))
self.instruction_stack.put(self.work_on_group(1))
self.instruction_stack.pop()
其中,最终我的工作组
、工作行
和工作列
函数将具有在结果展开时向堆栈添加指令的条件。然而,现在,当我尝试do\u next\u step()
时,我得到的是
working on group 9
working on group 8
...
working on group 2
working on group 1
因此,我的函数似乎是在我将它们放入堆栈时进行计算,而不是等待我弹出它们
理想情况下,如果运行正确,我会看到
第1组的工作
因为这是最后一条指令,我只有一条pop命令
另一件值得注意的事情——这三个函数只需要一个参数,我可以看到基于电路板的更复杂的函数,需要更多的参数,并且希望我的堆栈/弹出能够处理这一点——存储函数引用,然后使用任意数量的*args**kwargs
运行。我怎样才能做到这一点
编辑:
我已经想出了这个方法,我认为它可以对任意数量的位置参数起作用,但我不知道如何将关键字参数与此结合起来
def do_next_step(self):
if self.instruction_stack.empty():
self.instruction_stack.put((self.work_on_group,(9)))
self.instruction_stack.put((self.work_on_group,(8)))
self.instruction_stack.put((self.work_on_group,(7)))
self.instruction_stack.put((self.work_on_group,(6)))
self.instruction_stack.put((self.work_on_group,(5)))
self.instruction_stack.put((self.work_on_group,(4)))
self.instruction_stack.put((self.work_on_group,(3)))
self.instruction_stack.put((self.work_on_group,(2)))
self.instruction_stack.put((self.work_on_group,(1)))
func, params = self.instruction_stack.get()
func(params)
我通过将我的
do\u next\u step
函数更改为以下内容来实现这一点
def do_next_step(self):
"""
Creates, and then does, next step into stack.
"""
if self.instruction_stack.empty():
self.instruction_stack.put((self.work_on_group,(9,),{}))
self.instruction_stack.put((self.work_on_group,(8,),{}))
self.instruction_stack.put((self.work_on_group,(7,),{}))
self.instruction_stack.put((self.work_on_group,(6,),{}))
self.instruction_stack.put((self.work_on_group,(5,),{}))
self.instruction_stack.put((self.work_on_group,(4,),{}))
self.instruction_stack.put((self.work_on_group,(3,),{}))
self.instruction_stack.put((self.work_on_group,(2,),{}))
self.instruction_stack.put((self.work_on_group,(1,),{}))
func, params, keyword_params = self.instruction_stack.get()
func(*params, **keyword_params)
这是因为您正在将调用方法的结果放入队列-即
self.instruction\u堆栈。put(self.work\u on\u group(9))
将调用self.work\u on\u group(9)
的结果放入指令堆栈。如果你在你的问题中提供了一个runnable,那么你就可以告诉你如何避免它(如果你不明白的话)。是的,这就是解决问题的方法。这实际上是处理Python中函数的延迟调用(和“回调”)的一种相当常见的方法。