2

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関数の引数として使用しています。次のように簡単ではないようです。

send_command(CommandList.popleft)

簡単なことだと思いますが、わかりません。

誰か助けてもらえますか?

よろしくお願いします。

アンディ

4

3 に答える 3

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()
于 2010-07-14T20:26:05.777 に答える
1

unbeliは正しいです-()関数を呼び出す必要があり*、引数を解凍する必要があります。ただし、これdequeを実行できる場合は、を使用する必要はありません。

commandlist = [['A234', 5, True], ['B4242'], ['A234', 0]]

for command in commandlist:
   send_command(*command)

そしてそれは完全にうまくいくでしょう。詳細については、引数リストの解凍を参照してください。

キューが実際に必要になるのは、値を消費したいことをしている場合だけです。たとえば、完了したらコマンドリストを空にします。もちろん、リストを使用して同じことを行うこともできます。

q = [1,2,3,4]
while q:
   print q.pop(0)
print q

HTH

于 2010-07-14T20:40:08.097 に答える
0

やってみました:

send_command(CommandList.popleft()) # note the ()
于 2010-07-14T20:24:15.513 に答える