0

私はこの方法でクラスをゆがめました:

import Queue
import threading

class MyThread():
    q = Queue.Queue()
    content = []
    result = {}
    t_num = 0
    t_func = None
    def __init__ (self, t_num, content, t_func):
        for item in content:
            self.q.put(item)
        self.t_num = t_num
        self.t_func = t_func

    def start(self):
        for i in range(self.t_num):
            t = threading.Thread(target=self.worker)
            t.daemon = True
            t.start()
        self.q.join()
        return self.result

    def worker(self):
        while True:
            item = self.q.get()
            value = self.t_func(item)
            self.result[item] = value
            self.q.task_done()


x = [5, 6, 7, 8, 9]
def func(i):
    return i + 1

m = MyThread(4, x, func)
print m.start()

それはうまくいきます。関数 func を 2 つ以上のパラメーターで設計し、これらのパラメーターをリストに入れてクラスに渡す場合、関数ワーカーで func 関数を正しく呼び出すにはどうすればよいですか?

例えば。

def __init__ (self, t_num, content, t_func, t_func_p):
            for item in content:
                self.q.put(item)
            self.t_num = t_num
            self.t_func = t_func
            self.t_func_p = t_func_p

def func(i, j, k):
m = MyThread(4, x, func, [j, k])
4

3 に答える 3

1

*argsおよびを使用し**kwargsて、任意の数のパラメーターを関数に渡す必要があります。

詳細はこちら: http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/

于 2012-06-11T12:00:45.887 に答える
0

多分これが役立つかもしれません:

def __init__(self, t_num, content, func, *params):
    func(*params) # params is a list here [param1, param2, param3....]


def func(param1, param2, param3):
# or 
def func(*params): # for arbitrary number of params

m = MyThread(4, x, func, param1, param2, param3....)
于 2012-06-11T11:45:27.637 に答える
0

原則として、特定の関数に多くのパラメーターを渡す場合は、それらを単純なオブジェクトにラップすることを検討してください。その理由は次のとおりです。

  1. パラメータを追加/削除する必要がある場合は、オブジェクトと関数自体、メソッド シグネチャ (およびそのすべての参照) を変更するだけで済みます。
  2. オブジェクトを操作するときは、関数が何を受け取っているかを常に把握できます (これは、より多くの人がその関数を使用するチームで作業している場合に特に役立ちます)。
  3. 最後に、コンストラクターでオブジェクトの作成を制御するため、オブジェクトに関連付けられた値が正しいことを確認できます (たとえば、コンストラクターでは、空の値がないこと、または型が正しいことを確認できます) )。

それでも複数のパラメーターを使用したい場合は、*args と **kwargs を確認してください。個人的には好きではありませんが、関数を使用するために関数のソースを読まなければならなくなる可能性があるためです。

幸運を :)

于 2012-09-13T05:58:06.820 に答える