将额外的参数传递给只需要1的回调对象



所以我正在做一个小项目,我正在使用websocket客户端库,为了创建一个处理websocket连接的WebSocketApp对象,你可以用之类的东西实例化该对象

ws = websocket.WebSocketApp(uri, on_open=on_open, on_message=on_message, on_ping=on_ping)

现在我有一个名为on_message的函数,它是一个回调函数(对象?(,用于处理传入消息,或者更确切地说,如何处理这些消息,当收到完整消息时(显然(,它会被我创建的ws对象调用。on_message被定义为当WebSocketApp对象被实例化时的回调。

on_message类似于这个

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

我想要这样的东西:

def on_message(ws, message, someList)
somelist.append(message)

当然,我可以使用全局变量来引用我想要更新的对象(在本例中是一个列表(,但这似乎不是正确的方法,如果我可以在初始化WebSocketApp对象时传递对我想要更新对象的引用,那就太好了,比如:

ws = websock.WebSocketApp(uri, on_message=on_message(ref_to_Obj), on_open=on_open, on_close=on_close)

但显然这不起作用,因为我得到了一个TypeError: on_message() missing 2 required positional arguments: 'message' and objRef'错误。

我不完全确定如何处理这个问题。脑海中浮现出子类,但也不确定我该如何完成它。查看WebSocketApp的源,它说它有两个参数,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))

partial接受一个函数和实参(我在这里使用关键字实参(,并返回一个新的函数,该函数已经传递了部分应用的信息。

";穷人的";这个版本将只使用lambda:

ws = websock.WebSocketApp(uri, on_message=lambda ws, msg: on_message(ws, msg, ref_to_Obj))

partial应该是首选,因为它维护原始函数的元数据,这可能很有用。

最新更新