Cucco’s Compute Hack

コンピュータ関係の記事を書いていきます。

Threadを使うときの"TypeError: function1() got multiple values for argument 'arg1'"

threading.Threadを使って引数持つ関数を実行すると、以下のようなエラーになることがある。
run()に直接関数を記述せず、すでにある関数をrun()の中で実行しようとすると起きる。

"TypeError: function1() got multiple values for argument 'arg1'"

原因はよくわからない。

とりあえず回避した例。func1でself.kwargsを使うのと何が違うのか・・・。

# -*- coding: utf-8 -*-
import threading

class MyThread(threading.Thread):
	def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, daemon=None):
		#threading.Threadとしてのコンストラクタ
		threading.Thread.__init__(self, group=None, target=None, name=None, args=(), kwargs={}, daemon=None)
		
		#threadの中で使う引数(辞書)
		self.kwargs = kwargs
		return
		
	def func1(self,*args,**kwargs):
		x=kwargs["kwargs"]
		a=x["a"]
		b=x["b"]
		c=x["c"]
		print("thread main fun1",a,b,c)
		return
		
	def run(self):
		#実際の処理は、func1で行う。
		self.func1(kwargs=self.kwargs)
		return

def main():
	kwargs={"a":1,"b":2,"c":3}
	t=MyThread(kwargs=kwargs)
	t.start()

if __name__== '__main__':
	main()