使用Deque.popleft作为函数参数
我正在尝试用Python中的deque来存储一系列命令,以便通过串口发送。
我的函数“send_command”接受三个参数:命令(一个整数)、暂停时间和一个布尔值(真或假)。它的定义如下。
def send_command(self, command, pause=0, wait=False):
我想要做的是,而不是像这样调用这个函数:
send_command("A234", 5, True)
...或者...
send_command("B4242")
我希望能够把命令存储在一个deque列表中,然后使用popleft函数来调用我的函数。这样我就可以做到:
CommandList = deque((['A234', 5, True], ['B4242']))
...并且使用deque.append()来不断往列表里添加东西,这些东西随后会被发送到我的send_command函数。这样我就可以根据需要(或者根据我的代码串口部分的速度)随时往列表里添加或删除新命令。
我现在遇到的问题是如何使用 CommandList.popleft,或者deque列表的任何部分作为send_command函数的参数。看起来并没有那么简单:
send_command(CommandList.popleft)
我相信这一定是个简单的事情,但我就是搞不明白。
有人能帮忙吗?
非常感谢。
安迪
3 个回答
0
你试过这样做吗:
send_command(CommandList.popleft()) # note the ()
1
unbeli说得对 - 调用函数时需要加上()
,而且要用*
来解包参数。不过,其实你不需要使用deque
,直接这样做就可以了:
commandlist = [['A234', 5, True], ['B4242'], ['A234', 0]]
for command in commandlist:
send_command(*command)
这样也能正常工作。如果想了解更多,可以查看解包参数列表的相关内容。
队列(Queues)其实只有在你想要消耗这些值的时候才需要使用,比如说你希望在完成后命令列表是空的。当然,你也可以用列表来做到这一点:
q = [1,2,3,4]
while q:
print q.pop(0)
print q
希望这对你有帮助(HTH)
3
你可能需要类似这样的东西:
obj.send_command(*CommandList.popleft())
也就是说,调用 popleft 并把结果当作 send_command 的参数列表。self
参数表明这是一个成员函数,所以你需要在一个对象上调用它。
另一种方法,正如我在评论中写的,是用类似这样的方式来存储准备好的函数:
def make_command(obj, *args, **kwargs):
def f():
obj.send_command(*args, **kwargs)
return f
然后你可以这样做:
queue.append(make_command(obj, 'ABC', whatever='else'))
接着执行:
command = queue.popleft()
command()