使用Deque.popleft作为函数参数

2 投票
3 回答
1586 浏览
提问于 2025-04-16 01:18

我正在尝试用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()

撰写回答