如何将参数列表传递给Python中的函数

时间:2012-06-11 11:36:10

标签: python

我以这种方式扭曲了一个班级:

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

效果很好。如果我使用2个或更多参数设计函数func,并将列表中的这些参数传递给类,如何正确调用函数worker中的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])

3 个答案:

答案 0 :(得分:1)

您需要使用*args**kwargs将任意数量的参数传递给函数。

以下是更多信息:http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/

答案 1 :(得分: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....)

答案 2 :(得分:0)

作为一般规则,如果您要将许多参数传递给特定函数,您可以考虑将它们包装到一个简单的对象中,原因是

  1. 如果您需要添加/删除参数,您只需要修改对象,函数本身,方法签名(及其所有引用)将保持不变
  2. 使用对象时,您将始终知道您的功能正在接收什么(如果您在团队中工作,这将特别有用,更多人将使用该功能)。
  3. 最后,因为您在其构造函数上控制对象的创建,您可以确保与该对象关联的值是正确的(例如,在构造函数中,您可以确保没有空值,或者类型是正确的。)
  4. 如果你仍然想要使用多个参数,请检查* args和** kwargs,虽然我个人不喜欢这样,因为它可能最终强迫人们阅读函数的源代码以便使用它。

    祝你好运:)