我正在尝试存储一个命令列表,以便在Python中使用deque发送串行电缆。
我的函数“send_command”接受3个值;命令,一个int。暂停和布尔等待。其定义如下。
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函数的args。它看起来并不那么直接:
send_command(CommandList.popleft)
我确信这很简单,但我无法理解。
有人可以帮忙吗?
谢天谢地。
安迪
答案 0 :(得分: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()
答案 1 :(得分:1)
unbeli是对的 - 您需要()
来调用该函数,并且需要*
来解包参数。但是,当您可以执行此操作时,无需使用deque
:
commandlist = [['A234', 5, True], ['B4242'], ['A234', 0]]
for command in commandlist:
send_command(*command)
这将完美无缺。有关详细信息,请参阅unpacking argument lists。
如果你正在做一些你想要消耗这些值的事情,那么队列真的是必要的 - 比如说你希望你的命令列表在你完成时是空的。当然,您也可以使用列表执行相同的操作:
q = [1,2,3,4]
while q:
print q.pop(0)
print q
HTH
答案 2 :(得分:0)
你试过了吗?
send_command(CommandList.popleft()) # note the ()