Pythonのスレッドで引数を渡せなくて躓いた話。
初投稿です。
完全に自分用の備忘録です。読みにくさはご勘弁を。(しかも手元にiPhoneしかない。コードをフリック入力とか初めてです)
ここ3ヶ月ほどPythonを触ってるものの、未だに訳が分かっていない中、最近はスレッドをやりました。
普段はクラスを使ってこんな感じ。
import threading class MyThread(threading.Thread): def __init__(self, aaa): super().__init__() self._aaa = aaa def run(self): # 処理 print(self._aaa)
スレッドのスタートは
thread_1 = MyThread(aaa) thread_1.start()
で問題なくできました。完璧です。
関数でやるときは…
# クラス内の想定 def my_thread(self, aaa): # 処理 print(aaa)
スレッドスタートは…
thread_1 = threading.Thread(target=my_thread, args=aaa) thread_1.start()
としたところエラーが。
TypeError: my_thread() takes 2 positional arguments but 15 were given
15って何?!?!
aaaで渡そうとしていたのは14文字の文字列…
1つはselfだから…残りの14は文字列が1文字ずつ分割されて渡されてる…?
で、今更ながらスレッド処理を調べました。
使う前に調べなきゃいけないですね。
詳しい説明はもう覚えてないので改めて調べるのはまた今度にするとして省きますが、argsは引数をタプルとして関数に渡すんだとか。
args=(aaa,)
とするのが正解でした。
全体としては
thread_1 = threading.Thread(target=my_thread, args=(aaa,)) thread_1.start()
たったこれだけのことに、ちゃんとドキュメント見てやってないから躓いてました。
ドキュメント見たところで私の注意力じゃ見逃しそうですけどね。
こんなことで躓きつつも、
ここ半年でPythonにC#、Java、JavaScriptとちょこちょこ触って必死にコード書いてる新人の初投稿でした。
P.S. 既に誤字脱字を見つけては3回ほど編集しております。注意力散漫です。まだ誤字脱字あるかもですがご勘弁を…