use*_*295 0 arguments overloading parameter-passing keyword-argument python-3.x
所以我正在开发一个小项目,我正在使用 websocket 客户端库,为了创建一个WebSocketApp处理 websocket 连接的对象,您可以使用类似的方法实例化该对象
ws = websocket.WebSocketApp(uri, on_open=on_open, on_message=on_message, on_ping=on_ping)
Run Code Online (Sandbox Code Playgroud)
现在我有一个名为on_message回调函数(对象?)的函数,它处理传入的消息,或者更确切地说如何处理它们,并且ws当完整消息传入时(显然)由我创建的对象调用。 on_message被定义为实例化对象时的回调WebSocketApp。
on_message 是这样的
def on_message(ws, message):
print(message)
Run Code Online (Sandbox Code Playgroud)
我想要的是这样的:
def on_message(ws, message, someList)
somelist.append(message)
Run Code Online (Sandbox Code Playgroud)
我当然可以使用全局变量来引用我想要更新的对象(在本例中是一个列表),但这似乎不是正确的方法,如果我可以传递对该对象的引用,那就太好了我想在初始化WebSocketApp对象时进行更新,例如:
ws = websock.WebSocketApp(uri, on_message=on_message(ref_to_Obj), on_open=on_open, on_close=on_close)
Run Code Online (Sandbox Code Playgroud)
但显然这不起作用,因为我收到TypeError: on_message() missing 2 required positional arguments: 'message' and objRef'错误。
我不完全确定如何解决这个问题。我想到了子类化,但也不确定如何实现它。查看源代码,WebSocketApp它说它有 2 个参数,1)WebSocketApp类本身和 2)从服务器接收的 utf-8 数据。我从来没有传递这些,并且我假设库在创建它们时只是将这些引用传递出去,但是我如何重载它以包含其他参数?首先想到的是使用 *args 或 **kwargs 进行重载,但又不确定如何实现它。我之前问过,建议使用 lambda 函数,但我也不知道如何让它工作。
您想要“部分应用”该功能。可以使用以下方法来完成partial:
from functools import partial
ws = websock.WebSocketApp(uri, on_message=partial(on_message, someList=ref_to_Obj))
Run Code Online (Sandbox Code Playgroud)
partial接受一个函数和参数(我在这里使用关键字参数),并返回一个新函数,该函数已经传递了部分应用的信息。
“穷人”的版本将只使用lambda:
ws = websock.WebSocketApp(uri, on_message=lambda ws, msg: on_message(ws, msg, ref_to_Obj))
Run Code Online (Sandbox Code Playgroud)
partial不过应该是首选,因为它维护来自原始函数的元数据,这可能很有用。