0

スレッドを作成しようとするときに、スター付き式を固定引数リストと組み合わせて使用​​するのに問題があります。

次のコードを検討してください。

the_queue = Queue()

def do_something(arg1, arg2, queue):
    # Do some stuff...
    result = arg1 + arg2

    queue.put(result)

def init_thread(*arguments):
    t = Thread(target=do_something, args=(arguments, the_queue))
    t.start()
    t.join()

init_thread(3,6)

これは例外をスローします:

TypeError: do_something() takes exactly 3 arguments (2 given)

つまり、「arguments」タプルは 1 つのタプル オブジェクトとして評価され (つまり、アンパックされません)、_queue は 2 番目の引数と見なされます。

コードは、不明な数の引数でさまざまなメソッドを呼び出すスレッドを初期化できる必要がありますが、常に最後に「キュー」パラメーターがあります。

これを達成する方法はありますか?その場合、どのように?そうでない場合は、何が間違っているのでしょうか?

ありがとう。

編集: キューを引数として「init_thread()」メソッドを呼び出すことはオプションではないことを追加する必要があります。これは、コードの残りの部分に、スレッドハンドラーが内部でどのように機能するかを「認識」させたくないためです.. .

4

2 に答える 2

1

次のように、パックされた *arguments タプルをアンパックすることもできます。

>>> def Print(*args):
...     print('I am prepended to every message!', *args)
... 
>>> Print('This', 'has', 'four', 'arguments')
I am prepended to every message! This has four arguments
>>> def Print(*args):
...     print('I am prepended to every message!', args)
... 
>>> Print('This', 'has', 'four', 'arguments')
I am prepended to every message! ('This', 'has', 'four', 'arguments')

つまり、引数ではなく *agruments を参照すると、タプルがアンパックされます。したがって、コードは次のようになります。

def init_thread(*arguments):  
    t = Thread(target=do_something, args=(*arguments, the_queue))
    t.start()
    t.join()
于 2012-07-09T23:26:02.013 に答える
1

を新規作成する必要がありますtuple

t = Thread(target = do_something, args = arguments + (the_queue, ))
于 2012-07-09T21:33:53.233 に答える