2017-08-14 10 views
1

私はこれはかなり基本的だと思っていますが、Googleに正しい質問をする方法さえ分かりません。私はthis python websocket clientを使用していくつかのWebソケット接続を行っています。このタイプのPython関数に多くの引数を渡す

import websocket 
import thread 
import time 

def on_message(ws, message): 
    print(message) 

def on_error(ws, error): 
    print(error) 

def on_close(ws): 
    print("### closed ###") 

def on_open(ws): 
    def run(*args): 
     ws.send("Hello") 
     time.sleep(1) 
     ws.close() 
     print("thread terminating...") 
    thread.start_new_thread(run,()) 


if __name__ == "__main__": 
    websocket.enableTrace(True) 
    ws = websocket.WebSocketApp("ws://echo.websocket.org/", 
           on_message = on_message, 
           on_error = on_error, 
           on_close = on_close) 
    ws.on_open = on_open 
    ws.run_forever() 

だから、私は何をしようとしていますがon_open関数に複数の引数を追加している、このような何か:ちょうど私がそのページに類似したコード例を使用していると仮定しましょう

def on_open(ws, more_arg): 
    def run(*args): 
     ws.send("Hello %s" % more_arg) 
     time.sleep(1) 
     ws.close() 
     print("thread terminating...") 
    thread.start_new_thread(run,()) 

をしかし、私は、これらの引数を渡す方法を見つけ出すことはできませんので、私はメインスレッドで試してみました:

ws.on_open = on_open("this new arg") 

しかし、私はエラーを取得:

TypeError: on_open() takes exactly 2 arguments (1 given)

on_open関数にこれらの新しい引数を渡す方法を教えてください。

+0

@cᴏʟᴅsᴘᴇᴇᴅはい両方が助けたが、私は、私は1つを受け入れるより良いあなたの 'partial'使い方を好きになりました。 –

答えて

2

コールバックを割り当てる必要があることに注意してください。代わりに、関数を呼び出して戻り値をwsに渡していますが、これは間違っています。

あなたは上位1に関数をカレーためにfunctools.partialを使用することができます:funcが呼び出されると、それはfuncに渡された他の引数が続く"this new arg"として最初の引数、とon_openを呼び出します

from functools import partial 

func = partial(on_open, "this new arg") 
ws.on_open = func 

。詳細については、doclinkのpartialの実装を見てください。

+0

ありがとうございます。「コールバック」という用語は、私が何を空にしていたかと思います。ダニアル・サンチェス(Danial Sanchez)が提案したラムダ・テクニックは非常に非凡だと言わざるを得ないが、これに感謝する。 –

+1

@jeffery_the_windええ...彼らはすべて同じです。個人的に、私はlambdasが好きではありません:) –

1

あなたが呼び出しをラップするlambdaを使用することができます。

ws.on_open = lambda *x: on_open("this new arg", *x) 
関連する問題