使用Deque.popleft作为函数的args

时间:2010-07-14 20:21:18

标签: python list tuples deque

我正在尝试存储一个命令列表,以便在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)

我确信这很简单,但我无法理解。

有人可以帮忙吗?

谢天谢地。

安迪

3 个答案:

答案 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 ()