meieiのブログ

仕事や日々の備忘録。

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


たったこれだけのことに、ちゃんとドキュメント見てやってないから躓いてました。
ドキュメント見たところで私の注意力じゃ見逃しそうですけどね。

こんなことで躓きつつも、
ここ半年でPythonC#JavaJavaScriptとちょこちょこ触って必死にコード書いてる新人の初投稿でした。

P.S. 既に誤字脱字を見つけては3回ほど編集しております。注意力散漫です。まだ誤字脱字あるかもですがご勘弁を…