2010-07-14 194 views
2

我试图存储一个命令列表,以使用deque在Python中发送串行电缆。使用Deque.popleft作为函数的参数

我的函数“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,或双端队列列表作为args作为我send_command功能的任何部分挣扎的一部分。它看起来并不像以下那样简单:

send_command(CommandList.popleft) 

我确定这很简单,但我无法弄清楚。

任何人都可以帮忙吗?

谢谢你亲切。

安迪

回答

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() 
+0

Ahhha!看起来工作的是... self.send_command(* self.CommandList.popleft() ) ...但是,这是否意味着我不能再这样调用我的函数:send_command(“A1234”,wait = True)还是有一种方法来存储deque?self.CommandList.append([ 'b23456',wait = True])不能正常工作有什么想法? – Schodemeiss 2010-07-14 20:41:21

+0

是的,你可以。您可以使用** argdict将参数列表解压为* arglist和带有关键字参数的字典。但是,就像你写的那样,没有办法将它存储在一个整体中。存储准备好调用的闭包可能会更方便。 – unbeli 2010-07-14 20:45:31

+0

查看更新的例子 – unbeli 2010-07-14 20:54:20

0

你试过:

send_command(CommandList.popleft()) # note the() 
+0

是......没工作,要么:(我认为它的清晰度我的功能是这样的麻烦,虽然的。 – Schodemeiss 2010-07-14 20:26:06

+0

@Andy Barlow:对不起,我没有仔细阅读这个问题。@ unbeli的回答似乎更合适。 – MAK 2010-07-14 20:39:25

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